免责声明:数鲸团队提供的学习资料主要用于本文的自学,代码由数鲸团队提供。使用阿里云天池实验室和编辑器pycharm测试完成。学习目标:*理解逻辑回归理论*掌握逻辑回归的sklearn函数调用并应用于鸢尾花数据集预测代码流程:Part1Demo实践Step1:库函数导入Step2:模型训练Step3:模型参数查看Step4:数据与模型可视化Step5:模型预测Part2基于鸢尾花(iris)数据集的逻辑回归分类实践Step1:库函数导入Step2:数据读取/加载Step3:简单查看数据信息Step4:可视化描述Step5:使用逻辑回归模型在二分类上进行训练和预测Step6:使用逻辑回归模型对三分类(多分类)进行训练和预测逻辑回归原理介绍:逻辑回归是统计学中经典的分类方法。详见李航老师主编的《统计学习方法》第二版和周志华老师的西瓜书《机器学习》有详细的介绍。如图3.21所示。使用的logistic函数可以用python代码表示如下:importnumpyasnpiimportmatplotlib.pyplotaspltx=np.arange(-5,5,0.01)y=1/(1+np.exp(-x))plt.plot(x,y)plt.xlabel('z')plt.ylabel('y')plt.grid()plt.show()如图:Part1Demo实践#!/usr/bin/envpython#-*-coding:utf-8-*-##基础函数库importnumpyasnp##导入绘图库importmatplotlib.pyplotaspltimportseabornassns##导入逻辑回归模型函数fromsklearn.linear_modelimportLogisticRegression##Demo演示LogisticRegression分类##构造数据集x_fearures=np.array([[-1,-2],[-2,-1],[-3,-2],[1,3],[2,1],[3,2]])y_label=np.array([0,0,0,1,1,1])##调用逻辑回归模型lr_clf=LogisticRegression()##使用逻辑回归模型来fittheconstructionThedatasetlr_clf=lr_clf.fit(x_fearures,y_label)#拟合方程为y=w0+w1*x1+w2*x2##检查wprint('LogisticReg的权重ression:',lr_clf.coef_)##检查w0print('逻辑回归的截距(w0):',lr_clf.intercept_)##逻辑回归的权重:[[0.734620870.6947908]]##逻辑回归的截距(w0):[-0.03643213]##可视化构造数据样本点plt.figure()plt.scatter(x_fearures[:,0],x_fearures[:,1],c=y_label,s=50,cmap='viridis')plt.title('Dataset')plt.show()#可视化决策边界plt.图()plt.scatter(x_fearures[:,0],x_fearures[:,1],c=y_label,s=50,cmap='viridis')plt.title('Dataset')nx,ny=200,100x_min,x_max=plt.xlim()y_min,y_max=plt.ylim()x_grid,y_grid=np.meshgrid(np.linspace(x_min,x_max,nx),np.linspace(y_min,y_max,ny))z_proba=lr_clf.predict_proba(np.c_[x_grid.ravel(),y_grid.ravel()])z_proba=z_proba[:,1].reshape(x_grid.shape)plt.contour(x_grid,y_grid,z_proba,[0.5],线宽=2.,colors='blue')plt.show()###可视化预测新样本plt.figure()##新点1x_feurares_new1=np.array([[0,-1]])plt.scatter(x_fearures_new1[:,0],x_fearures_new1[:,1],s=50,cmap='viridis')plt.annotate(s='新点1',xy=(0,-1),xytext=(-2,0),color='blue',arrowprops=dict(arrowstyle='-|>',connectionstyle='arc3',color='red'))##新点2x_feurares_new2=np.array([[1,2]])plt.scatter(x_fearures_new2[:,0],x_fearures_new2[:,1],s=50,cmap='viridis')plt.annotate(s='新点2',xy=(1,2),xytext=(-1.5,2.5),color='red',arrowprops=dict(arrowstyle='-|>',connectionstyle='arc3',color='red'))##训练样本plt.scatter(x_fearures[:,0],x_fearures[:,1],c=y_label,s=50,cmap='viridis')plt.title('Dataset')#视觉决策边界plt.contour(x_grid,y_grid,z_proba,[0.5],linewidths=2.,colors='blue')plt.show()###可视化和预测新样本plt.figure()##newpoint1x_fearures_new1=np.array([[0,-1]])plt.scatter(x_fearures_new1[:,0],x_fearures_new1[:,1],s=50,cmap='viridis')plt.annotate(s='新点1',xy=(0,-1),xytext=(-2,0),color='blue',arrowprops=dict(arrowstyle='-|>',connectionstyle='arc3',color='red'))##新点2x_fearures_new2=np.array([[1,2]])plt.scatter(x_fearures_new2[:,0],x_fearures_new2[:,1],s=50,cmap='viridis')plt.annotate(s='新点2',xy=(1,2),xytext=(-1.5,2.5),color='red',arrowprops=dict(arrowstyle='-|>',connectionstyle='arc3',color='red'))##训练样本plt.s猫(x_fearures[:,0],x_fearures[:,1],c=y_label,s=50,cmap='viridis')plt.title('Dataset')#视觉决策边界plt.contour(x_grid,y_grid,z_proba,[0.5],linewidths=2.,colors='blue')plt.show()plot:可以发现,训练好的回归模型预测X_new1为类别0(判别面左下),X_new2预测为类别1(左上)辨别面的右侧)。概率为0.5的逻辑回归模型的判别面就是上图中的蓝线。不过提供的代码也有一些小问题,例如:importseabornassns虽然导入了seaborn库,但是在程序中并没有使用到。3.2基于鸢尾花(iris)数据集的逻辑回归分类实践在最开始的实践中,我们首先需要导入一些基础函数库,包括:numpy(Python中科学计算的基础软件包)(但在实际操作中代码运行不需要numpy包)、pandas(pandas是一种快速、强大、灵活、易用的开源数据分析和处理工具)、matplotlib和seaborn绘图。这次我们选择鸢尾花数据(iris)来尝试训练方法。数据集一共包含5个变量,包括4个特征变量和1个目标分类变量。一共150个样本,目标变量是花的类别,都属于鸢尾属下的三个亚属,即Iris-setosa、Iris-versicolor和Iris-virginica)。包括的三种鸢尾的四个特征是萼片长(cm)、萼片宽(cm)、花瓣长(cm)、花瓣宽(cm),这些形态学特征过去曾被用来鉴定物种。数据集如图:##基础函数库importnumpyasnpimportpandasaspd##绘图函数库importmatplotlib.pyplotaspltimportseabornassns##我们使用sklearn自带的iris数据作为数据加载,并使用PandasConverttoDataFrameformatfromsklearn.datasetsimportload_irisdata=load_iris()#获取数据特征iris_target=data.target#获取数据对应的labeliris_features=pd.DataFrame(data=data.data,columns=data.feature_names)#使用Pandas转换为DataFrame格式##使用.info()查看数据的整体信息iris_features.info()####RangeIndex:150entries,0to149##Datacolumns(total4columns):###ColumnNon-NullCountDtype##----------------------------##0sepallength(cm)150non-nullfloat64##1sepalwidth(cm)150non-nullfloat64##2petallength(cm)150non-nullfloat64##3petalwidth(cm)150non-nullfloat64##dtypes:float64(4)##memoryusage:4.8KB##用于简单数据查看,我们可以用.head()head.tail()tailiris_features.head()##对应的类别标签为,其中0、1、2分别代表‘setosa’、‘versicolor’、‘virginica’三种不同的类别iris_target##数组([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,##0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,##0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,##1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,##1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,##2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,##2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2])##使用value_counts函数查看数量每个类别的pd.Series(iris_target).value_counts()##250##150##050##dtype:int64##使用value_counts函数查看每个类别pd.Series(iris_target)的个数。value_counts()##250##150##050##dtype:int64##合并标签和特征信息iris_all=iris_features.copy()##做一个浅拷贝,防止修改原始数据iris_all['target']=iris_target##特征和标签组合的散点图可视化x='target',y=col,saturation=0.5,palette='pastel',data=iris_all)plt.title(col)plt.show()#选择前三个特征绘制3Dsc从mpl_toolkits.mplot3d导入Axes3Dfig=plt.atterplot。图(figsize=(10,8))ax=fig.add_subplot(111,projection='3d')iris_all_class0=iris_all[iris_all['target']==0].valuesiris_all_class1=iris_all[iris_all['target']==1].valuesiris_all_class2=iris_all[iris_all['target']==2].values#'setosa'(0),'versicolor'(1),'virginica'(2)ax.scatter(iris_all_class0[:,0],iris_all_class0[:,1],iris_all_class0[:,2],label='setosa')ax.scatter(iris_all_class1[:,0)],iris_all_class1[:,1],iris_all_class1[:,2],label='versicolor')ax.scatter(iris_all_class2[:,0],iris_all_class2[:,1],iris_all_class2[:,2],label='virginica')plt.legend()plt.show()##为了正确评价模型性能,将数据分为训练集和测试集,在训练集上训练模型,在测试上验证模型性能放fromsklearn.model_selectionimporttrain_test_split##选择类别为0和1的样本(排除类别为2的样本)iris_features_part=iris_features.iloc[:100]iris_target_part=iris_target[:100]##测试集大小为20%,80%/20%pointsx_train,x_test,y_train,y_test=train_test_split(iris_features_part,iris_target_part,test_size=0.2,random_state=2020)##从sklearn导入逻辑回归模型fromsklearn.linear_modelimportLogisticRegression##定义逻辑回归模型clf=LogisticRegression(random_state=0,solver='lbfgs')##在训练集上训练逻辑回归模型clf.fit(x_train,y_train)##查看其对应的wprint('逻辑回归的权重:',clf.coef_)##查看其对应的w0print('theintercept(w0)ofLogisticRegression:',clf.intercept_)##分布在训练集和测试集上并使用训练好的模型进行预测train_predict=clf.predict(x_train)test_predict=clf.predict(x_test)来自sklearnimportmetrics##使用准确度(accuracy)[正确预测的样本数量占预测样本总数的比例]来评估模型的效果print('TheaccuracyoftheLogisticRegressionis:',metrics.accuracy_score(y_train,train_predict))print('预测的准确率eLogisticRegressionis:',metrics.accuracy_score(y_test,test_predict))##查看混淆矩阵(预测值和真实值各种情况的统计矩阵)confusion_matrix_result=metrics.confusion_matrix(test_predict,y_test)print('混淆矩阵result:\n',confusion_matrix_result)##使用热图可视化结果plt.figure(figsize=(8,6))sns.heatmap(confusion_matrix_result,annot=True,cmap='Blues')plt.xlabel('Predictedlabels')plt.ylabel('Truelabels')plt.show()##LogisticRegression的accuracy是:1.0##LogisticRegression的accuracy是:1.0##混淆矩阵结果:##[[90]##[011]]##测试集大小为20%、80%/20%点x_train,x_test,y_train,y_test=train_test_split(iris_features,iris_target,test_size=0.2,random_state=2020)##定义逻辑回归模型clf=LogisticRegression(random_state=0,solver='lbfgs')##在训练集上训练逻辑回归模型clf.fit(x_train,y_train)##训练logist训练集上的ic回归模型clf.fit(x_train,y_train)##查看其对应的wprint('逻辑回归的权重:\n',clf.coef_)##查看其对应的w0print('截距(w0)逻辑回归:\n',clf.intercept_)##因为这是3个分类,我们这里得到了三个逻辑回归模型的参数,三个逻辑回归可以结合起来实现三个分类##将训练好的模型分布在训练集和测试集上进行预测train_predict=clf.predict(x_train)test_predict=clf.predict(x_test)##因为逻辑回归模型是一个概率预测模型(前面介绍过p=p(y=1|x,\theta)),所有我们可以使用predict_proba函数预测它的概率train_predict_proba=clf.predict_proba(x_train)test_predict_proba=clf.predict_proba(x_test)print('测试预测每个类的概率:\n',test_predict_proba)##第一列代表0类的预测的概率,第二列代表预测class1的概率,第三列代表预测class2的概率##使用准确度(accuracy)[正确样本数占预测样本总数的比例]来评估模型的效果print('TheaccuracyoftheLogisticRegressionis:',metrics.accuracy_score(y_train,train_predict))print('LogisticRegression的准确率是:',metrics.accuracy_score(y_test,test_predict))##查看混淆矩阵confusion_matrix_result=metrics.confusion_matrix(test_predict,y_test)print('混淆矩阵结果:\n',confusion_matrix_result)##使用热图可视化结果plt.figure(figsize=(8,6))sns.heatmap(confusion_matrix_result,annot=True,cmap='Blues')plt.xlabel('Predictedlabels')plt.ylabel('Truelabels')plt.show()##混淆矩阵结果:##[[1000]##[082]##[028]]绘图:从上面图片,可以发现在2D中不同类别花卉的不同特征组合的散点分布,以及近似的区分能力。利用箱线图,我们还可以得到不同类别在不同特征上的分布差异。我们可以发现它的准确率是1,也就是说所有的样本都预测正确了。[1]周志华,机器学习[1]李航,统计学习方法(第二版)