塘沽网站制作公司,天津网站优化公司推荐哪家,优质网站,wordpress 子post文章目录 1. IRIS数据集介绍2. 具体步骤2.1 手动将数据转化为numpy矩阵2.1.1 从csv文件数据构建Numpy数据2.1.2 模型的搭建与训练2.1.3 分类器评估2.1.4 分类器的分类报告总结2.1.5 用交叉验证#xff08;Cross Validation#xff09;来验证分类器性能2.1.6 完整代码#xf… 文章目录 1. IRIS数据集介绍2. 具体步骤2.1 手动将数据转化为numpy矩阵2.1.1 从csv文件数据构建Numpy数据2.1.2 模型的搭建与训练2.1.3 分类器评估2.1.4 分类器的分类报告总结2.1.5 用交叉验证Cross Validation来验证分类器性能2.1.6 完整代码 2.2 使用sklearn内置的iris数据集(多分类)2.2.1 导入数据集2.2.2 划分训练集和测试集2.2.3 定义逻辑回归模型并训练2.2.5 用训练好的模型在训练集和测试集上做预测2.2.6 对预测结果进行可视化 1. IRIS数据集介绍
Iris也称鸢尾花卉数据集,是常用的分类实验数据集由R.A. Fisher于1936年收集整理的。其中包含3种植物种类分别是山鸢尾setosa变色鸢尾versicolor和维吉尼亚鸢尾virginica每类50个样本共150个样本。
该数据集包含4个特征变量1个类别变量。iris每个样本都包含了4个特征花萼长度花萼宽度花瓣长度花瓣宽度以及1个类别变量label。我们需要建立一个分类器分类器可以通过这4个特征来预测鸢尾花卉种类是属于山鸢尾变色鸢尾还是维吉尼亚鸢尾。其中有一个类别是线性可分的其余两个类别线性不可分这在最后的分类结果绘制图中可观察到。
变量名变量解释数据类型sepal_length花萼长度单位cmnumericsepal_width花萼宽度单位cmnumericpetal_length花瓣长度单位cmnumericpetal_width花瓣长度单位cmcategorical
2. 具体步骤
Step1:数据集预览
dfpd.read_csv(./data/iris.data.csv,header0)
print(df.head())2.1 手动将数据转化为numpy矩阵
2.1.1 从csv文件数据构建Numpy数据
Step 1构造映射函数iris_type。因为实际数据中label并不都是便于学习分类的数字型而是string类型。
Step 2对于文本类的label, 将label列的所有内容都转变成映射函数的输出存成新的dataframe Step 3将Step2的结果转换成numpy矩阵 Step 4划分训练集与测试集
def iris_type(s):class_label{Iris-setosa:0,Iris-versicolor:1,Iris-virginica:2}return class_label[s]
dfpd.read_csv(./data/iris.data.csv,header0)
#2.将第4列内容映射至iris_type函数定义的内容
df[Species]df[Species].apply(iris_type)
print(df.head())
#3.将df解析到numpy_arrat
datanp.array(df)
# print(data[:2])#4.将原始数据集分为测试集合和验证集合
# 用np.split按列axis1进行分割
# (4,):分割位置前4列作为x的数据第4列之后都是y的数据
x,ynp.split(data,(4,),axis1)
x_train,x_test,y_train,y_testtrain_test_split(x,y,test_size0.7,random_state0)2.1.2 模型的搭建与训练 Pipeline(steps) 利用sklearn提供的管道机制 Pipeline 来实现对全部步骤的流式化封装与管理。 第一个环节可以先进行 数据标准化 StandardScaler()中间环节可以加上 PCA降维处理 取2个重要特征最终环节逻辑回归分类器
pip_LRPipeline([(sc,StandardScaler()),(pca,PCA(n_components2)),(clf_lr,LogisticRegression(random_state1))])#开始训练
pip_LR.fit(x_train,y_train.ravel())#显示当前管道的配置和参数设置它并没有直接运行或产生实际的影响只展示了机器学习管道的配置
Pipeline(memoryNone,steps[(sc, StandardScaler(copyTrue, with_meanTrue, with_stdTrue)), (pca, PCA(copyTrue, iterated_powerauto, n_components2, random_stateNone,svd_solverauto, tol0.0, whitenFalse)), (clf_lr, LogisticRegression(C1.0, class_weightNone, dualFalse, fit_interceptTrue,intercept_scaling1, max_iter100, multi_classovr, n_jobs1,penaltyl2, random_state1, solverliblinear, tol0.0001,verbose0, warm_startFalse))])2.1.3 分类器评估
print(训练准确率%0.2f%pip_LR.score(x_train,y_train))print(测试准确率%0.2f%pip_LR.score(x_test,y_test))y_hatpip_LR.predict(x_test)
accuracymetrics.accuracy_score(y_test,y_hat)
print(逻辑回归分类器的准确率%0.2f % accuracy)2.1.4 分类器的分类报告总结
精确度Precision指的是在所有模型预测为某一类别的样本中真正属于该类别的比例。计算方式为该类别的 True Positives / (True Positives False Positives)。召回率(Recall)指的是在所有实际属于某一类别的样本中被模型正确预测为该类别的比例。计算方式为该类别的 True Positives / (True Positives False Negatives)F1 Score是精确度和召回率的调和平均数综合考虑了两者的性能。计算方式为 2 ∗ P r e c s i o n ∗ R e c a l l P r e c i s i o n R e c a l l 2*\frac{Precsion*Recall}{PrecisionRecall} 2∗PrecisionRecallPrecsion∗Recallsupport:指的是属于该类别的样本数。accuracy准确度指的是模型在所有类别上正确预测的比例。计算方式为 Sum of True PositivesTotal SamplesTotal SamplesSum of True Positives。macro avg宏平均对所有类别的指标取平均不考虑类别样本数量的差异。weighted avg加权平均对所有类别的指标取加权平均考虑类别样本数量的差异。
#描述分类器的精确度召回率F1Score
target_names[Iris-setosa,Iris-versicolor,Iris-virginica]
print(metrics.classification_report(y_test,y_hat,target_namestarget_names))2.1.5 用交叉验证Cross Validation来验证分类器性能
交叉验证常用于防止模型过于复杂而造成过拟合同时也称为循环估计。基本思想是将原始数据分成K组一般是平均分组每个子集数据分别做一次验证集或测试集其余的K-1个子集作为训练集。这样就会得到K个模型取这K个模型的分类准确率的平均数作为分类器的性能指标更具说服力。
比如说在这里我们使用的是5折交叉验证(5-fold cross validation)即数据集被分成了5份轮流将其中4份作为训练数据集剩余1份作为测试集进行试验。每次试验都会得出相应的正确率将5次试验得出的相应正确率的平均值作为分类器的准确率的估计。同样的K也可以取1020等。
iris_datax
iris_targety
scorescross_val_score(pip_LR,iris_data,iris_target.ravel(),cv5,scoringf1_macro)
print(5折交叉验证:\n逻辑回归分类器的准确率%.2f 误差范围(/- %.2f)%(scores.mean(), scores.std()*2))
X_trainval, X_test, y_trainval, y_test train_test_split(iris_data, iris_target, random_state0)
X_train, X_val, y_train, y_val train_test_split(X_trainval, y_trainval, random_state1)
print(训练集大小:{} 验证集大小:{} 测试集大小:{}.format(X_train.shape[0],X_val.shape[0],X_test.shape[0]))
2.1.6 完整代码
#将原始数据文件转为机器学习可用的numpy数据
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import plotly.express as px
import chart_studio.grid_objs as go
from sklearn.decomposition import PCA
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import GridSearchCVdef iris_type(s):class_label{Iris-setosa:0,Iris-versicolor:1,Iris-virginica:2}return class_label[s]
dfpd.read_csv(./data/iris.data.csv,header0)
#2.将第4列内容映射至iris_type函数定义的内容
df[Species]df[Species].apply(iris_type)
print(df.head())
#3.将df解析到numpy_arrat
datanp.array(df)
# print(data[:2])#4.将原始数据集分为测试集合和验证集合
# 用np.split按列axis1进行分割
# (4,):分割位置前4列作为x的数据第4列之后都是y的数据
x,ynp.split(data,(4,),axis1)
# X x[:,0:2] # 取前两列特征
# 用train_test_split将数据按照73的比例分割训练集与测试集
# 随机种子设为1每次得到一样的随机数设为0或不设每次随机数都不同
x_train,x_test,y_train,y_testtrain_test_split(x,y,test_size0.7,random_state0)
pip_LRPipeline([(sc,StandardScaler()),(pca,PCA(n_components2)),(clf_lr,LogisticRegression(random_state1))])#开始训练
pip_LR.fit(x_train,y_train.ravel())#显示当前管道的配置和参数设置它并没有直接运行或产生实际的影响只展示了机器学习管道的配置
Pipeline(memoryNone,steps[(sc, StandardScaler(copyTrue, with_meanTrue, with_stdTrue)), (pca, PCA(copyTrue, iterated_powerauto, n_components2, random_stateNone,svd_solverauto, tol0.0, whitenFalse)), (clf_lr, LogisticRegression(C1.0, class_weightNone, dualFalse, fit_interceptTrue,intercept_scaling1, max_iter100, multi_classovr, n_jobs1,penaltyl2, random_state1, solverliblinear, tol0.0001,verbose0, warm_startFalse))])
print(训练准确率%0.2f%pip_LR.score(x_train,y_train))
print(测试准确率%0.2f%pip_LR.score(x_test,y_test))
y_hatpip_LR.predict(x_test)
accuracymetrics.accuracy_score(y_test,y_hat)
print(逻辑回归分类器的准确率%0.2f % accuracy)#描述分类器的精确度召回率F1Score
target_names[Iris-setosa,Iris-versicolor,Iris-virginica]
print(metrics.classification_report(y_test,y_hat,target_namestarget_names))#交叉验证Cross Validation来验证分类器的性能
iris_datax
iris_targety
scorescross_val_score(pip_LR,iris_data,iris_target.ravel(),cv5,scoringf1_macro)
print(5折交叉验证:\n逻辑回归分类器的准确率%.2f 误差范围(/- %.2f)%(scores.mean(), scores.std()*2))
X_trainval, X_test, y_trainval, y_test train_test_split(iris_data, iris_target, random_state0)
X_train, X_val, y_train, y_val train_test_split(X_trainval, y_trainval, random_state1)
print(训练集大小:{} 验证集大小:{} 测试集大小:{}.format(X_train.shape[0],X_val.shape[0],X_test.shape[0]))
网格搜索验证见用逻辑回归实现鸢尾花数据集分类2 - Heywhale.com
2.2 使用sklearn内置的iris数据集(多分类)
2.2.1 导入数据集
#导入内置数据集已经处理空置无需进行预处理
iris load_iris()print(数据集的前5个样例, iris.data[0:5])2.2.2 划分训练集和测试集
y iris.target
X iris.data
X_train, X_test, Y_train, Y_test train_test_split(X, y, train_size0.8, random_state2020)2.2.3 定义逻辑回归模型并训练
logistic LogisticRegression(random_state0,solverlbfgs)
logistic.fit(X_train, Y_train)
print(the weight of Logistic Regression:\n,logistic.coef_)
print(the intercept(w0) of Logistic Regression:\n,logistic.intercept_)
y_train_predictlogistic.predict(X_train)
y_test_predict logistic.predict(X_test)可以看到此处打印出了三组参数这是因为这里我们是三分类问题。 2.2.5 用训练好的模型在训练集和测试集上做预测
#由于逻辑回归模型是概率预测模型所有我们可以利用 predict_proba 函数预测其概率
train_predict_proba logistic.predict_proba(X_train)
test_predict_proba logistic.predict_proba(X_test)
print(The test predict Probability of each class:\n,test_predict_proba)# 利用accuracy准确度【预测正确的样本数目占总预测样本数目的比例】评估模型效果
print(The accuracy of the Logistic Regression is:,metrics.accuracy_score(Y_train,y_train_predict))
print(The accuracy of the Logistic Regression is:,metrics.accuracy_score(Y_test,y_test_predict))confusion_matrix_result metrics.confusion_matrix(y_test_predict,Y_test)
print(The confusion matrix result:\n,confusion_matrix_result)2.2.6 对预测结果进行可视化
confusion_matrix_result metrics.confusion_matrix(y_test_predict,Y_test)
print(The confusion matrix result:\n,confusion_matrix_result)# 利用热力图对于结果进行可视化
plt.figure(figsize(8, 6))
sns.heatmap(confusion_matrix_result, annotTrue, cmapBlues)
plt.xlabel(Predicted labels)
plt.ylabel(True labels)
plt.show()通过结果我们可以发现其在三分类的结果其在测试集上的准确度为: 86.67% 这是由于’versicolor’1和 ‘virginica’2这两个类别的特征我们从可视化的时候也可以发现其特征的边界具有一定的模糊性边界类别混杂没有明显区分边界所有在这两类的预测上出现了一定的错误。 从混淆矩阵中可以看出标签值y0的10个样本都被正确分类标签值y1的10个样本中有8个被正确分类其中有两个被误分类为y2标签值y2的10个样本中有8个被正确分类其中有两个被误分类为y1。