最近在跟着Github上的一个开源项目学习机器学习,叫100 Days of ML Coding(英文版),100 Days of ML Coding(中文版)遗憾的是:项目里面的代码并没有细致的讲解,对于我这种编程能力上的小菜鸡来说有些吃力。本文只介绍跟实现代码相关的函数,记录下来也方便自己以后复习。如有不正确的地方还望大神能够多多指点。
这次讲解的是DAY4-6:Logistic Regression(逻辑回归)
首先:下载数据集
该数据集包含了社交网络中用户的信息。这些信息涉及用户ID,性别,年龄以及预估薪资。一家汽车公司刚刚推出了他们新型的豪华SUV,我们尝试预测哪些用户会购买这种全新SUV。并且在最后一列用来表示用户是否购买。
100-Days-Of-ML-Code:Day4-6_Logistic_regression代码函数总结-LMLPHP

第一部分:常规模块代码(饭前小吃)。第二部分:可视化部分代码(主食)
第一部分(小吃部分)
一,导入模块和数据

#导入模块
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
#导入数据
dataset=pd.read_csv('/home/peng/learngit/100-Days-Of-ML-Code/datasets/Social_Network_Ads.csv')
X=dataset.iloc[:,2:4].values
Y=dataset.iloc[:,4].values

都是基于pandas库的函数和方法
一)read_csv方法:
dataset=pd.read_csv(‘xxx.csv’)
返回的是DataFrame数据类型,该数据类型是一种二维标记数据结构。标记为默认标记,行数从0开始,列数也从0开始自动的标记。即将表格中的数据生成DataFrame类型数据并返回给dataset变量。
二)pandas.DataFrame.iloc[]方法:
X=dataset.iloc[:,2:4].values
iloc()纯粹基于整数位置的索引,用于按位置选择,[:,2:4]
逗号前面表示行号索引,逗号后面表示列号索引。按照python切片的原理,行号为所有行数,列数为2,3列。(看上面图片表格),即为Age和Estimated Salary这一列,在索引后面添加上values,即为学习的两个特征。
同理:Y=dataset.iloc[:,4].values为Purchased这一列的所有值,即为逻辑回归最后生成的结果。

二,将数据集分成训练集和测试集

#将数据集分成训练集和测试集
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,Y,test_size=0.25,random_state=0)

一)train_test_split()
返回四个值
X_train,X_test, y_train, y_test =train_test_split(train_data,train_target,test_size=, random_state=)
参数train_data,train_target好理解,即为要训练的数据和生成结果。
参数test_size若是浮点数,则表示为测试集占整个样本的比例,若是整数,则是测试集的个数。
参数random_state为0或者不填都是表示每次划分训练集和测试集都不一样;若为1则表示每次划分结果都一样。

三,进行特征放缩

#进行特征放缩,当有多个特征向量的时候,由多特征梯度下降算法
#特征向量的参数可能变化范围会比较大
from sklearn.preprocessing import StandardScaler
sc=StandardScaler()
X_train=sc.fit_transform(X_train)
X_test=sc.transform(X_test)

一)StandardScaler()方法:
这边涉及到一个问题,fit_transform()函数和transform()
函数有什么区别。我参考了其他博客主的解答:必须计算特征数据的均值和方差,再进行归一化。在使用fit_transform()时候已经找到了那个均值和方差,即所谓的转化规则,所以在测试集上我们可以直接运用。详细可见
sklearn库中数据预处理函数fit_transform()和transform()的区别

四,对数据进行逻辑回归,并预测

#逻辑回归模型.fit()的时候已经生成了模型
from sklearn.linear_model import LogisticRegression
classifier=LogisticRegression()
classifier.fit(X_train,y_train)

#预测
y_pred=classifier.predict(X_test)

这个代码好理解,并不做过多说明。注:LogiticRegression().fit(X_train,y_train)在内部已经生成了相应的模型,所以接下来直接调用predict()函数即可。

五,生成混淆矩阵

from sklearn.metrics import confusion_matrix
cm=confusion_matrix(y_test,y_pred)
print(cm)

混淆矩阵的概念就不多说,这边可以添加一行print(cm)代码查看结果:
[[65 3]
[ 8 24]]

第二部分:可视化模块(这次博客的主食来了!)
项目中对于训练集和测试集均有可视化结果,两者完全一样,以下讲解对训练集的可视化。

#可视化
from matplotlib.colors import ListedColormap
#对于训练集的可视化
X_set,y_set=X_train,y_train
X1,X2=np.meshgrid(np.arange(start=X_set[:,0].min()-1,stop=X_set[:,0].max()+1,step=0.01),
                  np.arange(start=X_set[:,1].min()-1,stop=X_set[:,1].max()+1,step=0.01))
plt.contourf(X1,X2,classifier.predict(np.array([X1.ravel(),X2.ravel()]).T).reshape(X1.shape),
             alpha=0.75,cmap=ListedColormap(('red','green')))
plt.xlim(X1.min(),X1.max())
plt.ylim(X2.min(),X2.max())
for i,j in enumerate(np.unique(y_set)):
    plt.scatter(X_set[y_set==j,0],X_set[y_set==j,1],
                c=ListedColormap(('red','green'))(i),label=j)

plt.title('LOGISTIC(Training set)')
plt.xlabel('Age')
plt.ylabel('Estimated Salary')
plt.legend
plt.show()

一)numpy.arange()方法
numpt.arange([start],stop,[step],dtype=None)
在给定间隔范围内返回均匀间隔的值。
在[start,stop)半开半闭区间内,按照step的间隔,均匀产生ndarray。
与range()的区别在与arange产生的是ndarray,而不是一个list。并且arange()可以生成浮点数类型,而range()只能是整数类型。
补充说明:当范围小于0.02,人类视觉上来说是连续的一片区域

#对于第一个标准化后的特征Age,进行切分。这边切分成[616,]大小
np.arange(start=X_set[:,0].min()-1,stop=X_set[:,0].max()+1,step=0.01)
#同理,对第二个标准化后的特征Estimated Salary进行切分,这边为[592,]大小
np.arange(start=X_set[:,1].min()-1,stop=X_set[:,1].max()+1,step=0.01)

二)numpy.meshgrid()方法
numpy.meshgrid(x,y)
从两个坐标向量中返回两个坐标矩阵
参数x,y代表网格中的一维数组,返回二维数组(矩阵),其中行数为x的个数,列数为y的个数。即产生(len(x),len(y))形状的矩阵。其中矩阵的剩余部分,用重复的x,y来填补。返回的第一个矩阵,以x来填充成矩阵(生成很多相同行);返回的第二个矩阵,以y来填充矩阵(生成很多相同列)。

#这边生成了[616,592]大小的矩阵X1,X2
X1,X2=np.meshgrid(np.arange(start=X_set[:,0].min()-1,stop=X_set[:,0].max()+1,step=0.01),
                  np.arange(start=X_set[:,1].min()-1,stop=X_set[:,1].max()+1,step=0.01))

三)matplotlib.pyplot.contourf()方法

1)matplotlib.pyplot.contourf([X,Y,],z,[levels],**kwargs)
描绘并且
参数X,Y,代表Z值中的坐标[x,y],xy都必须同时跟z是相同形状的坐标,可以通过meshgrid()函数来生成。X为列坐标。Y为行坐标。alpha参数表示颜色的透明度。
2)numpy中的array()方法
numpy中的array(),存储单一数据类型的多维数组,整个array()算一个对象。而list本质上每个元素都是对象。一个list里面可以有不同的数据类型。
3)numpy.ndarray(a).ravel():将a展平为一维数组
4)numpy.ndarray(a).T跟numpy.transpose(a)是一样的,都是算出a的转置矩阵。

#alpha表示颜色透明度,cmap表示所要填充的颜色
plt.contourf(X1,X2,classifier.predict(np.array([X1.ravel(),X2.ravel()]).T).reshape(X1.shape),
             alpha=0.75,cmap=ListedColormap(('red','green')))
‘’‘该代码表示将X1,X2变成[2,616*592]大小的array后进行转置
转置成[616*592,2]的矩阵后输入到回归模型中进行预测
输出的结果转成X1形状的矩阵’‘’
classifier.predict(np.array([X1.ravel(),X2.ravel()]).T).reshape(X1.shape)

四)plt.scatter()方法
1)plt.scatter()
scatter(x,y,s=None,c=None,marker=None,cmap=None, norm=None,vmin=None,vmax=None,alpha=None, linewidths=None,verts=None,edgecolors=None, *, data=None,**kwargs)
官方文档说明
y与x的散点图,具有不同的标记大小或颜色。
2)numpy.unique()
找到数组中没有重复的元素,并且按照从小到大的顺序排列后输出。
3)enumerate()函数
enumerate(sequence, [start=0])
用于将一个可遍历的数据对象(如列表,元祖或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用于for循环。
索引一般从0开始,举例子
例子:
seasons = [‘Spring’, ‘Summer’, ‘Fall’, ‘Winter’]
list(enumerate(seasons))
[(0, ‘Spring’), (1, ‘Summer’), (2, ‘Fall’), (3, ‘Winter’)]
4)如何理解X_set[y_set=j,0]
y_set=j会生成[True,True,False,…,True],大小为shape(y)的布尔数组
[y_set==j,0]为行数仅为True,列数为0的数组输出

for i,j in enumerate(np.unique(y_set)):
    plt.scatter(X_set[y_set==j,0],X_set[y_set==j,1],
                c=ListedColormap(('red','green'))(i),label=j)

这个函数表面,标签值为0,即不购买的人数的坐标,用红色点来表示。标签值为1,购买的人数坐标用绿色的标签值来表示。
五)关于绘图
plt.xlim()
plt.ylim()
plt.title()
plt.xlabel()
plt.ylabel()
plt.legend
plt.show()
这个好理解,不再详细描述。

plt.xlim(X1.min(),X1.max())
plt.ylim(X2.min(),X2.max())
plt.title('LOGISTIC(Training set)')
plt.xlabel('Age')
plt.ylabel('Estimated Salary')
plt.legend
plt.show()

最后生成的结果图
100-Days-Of-ML-Code:Day4-6_Logistic_regression代码函数总结-LMLPHP
100-Days-Of-ML-Code:Day4-6_Logistic_regression代码函数总结-LMLPHP
喜欢这篇总结的话不忘点个赞哦~

10-05 13:12