机器学习100天-逻辑回归 [ 混淆矩阵, np.meshgrid(),np.ravel() ]
相关知识点:
1 混淆矩阵 confusion_matrix : 混淆矩阵类似于
混淆矩阵也称误差矩阵,是表示精度评价的一种标准格式,用n行n列的矩阵形式来表示。混淆矩阵的每一列代表了预测类别 ,每一列的总数表示预测为该类别的数据的数目;每一行代表了数据的真实归属类别,每一行的数据总数表示该类别的数据实例的数目。
如有150个样本数据,预测为1,2,3类各为50个。分类结束后得到的混淆矩阵为:
红色框数据表示:样本实际类别为1并且预测类别也为1的样本数目为43
绿色框数据表示:样本实际类别为1并且预测类别也为2的样本数目为2
黄色框数据表示:样本实际类别为1并且预测类别也为3的样本数目为0
以此类推。。。
所以混淆矩阵可以很直观的看出分类器classifier的性能
2 生成网格点坐标矩阵 numpy.meshgrid(x, y) :
如何生成(0,0),(1,0),(2,0),(0,1),(1,1),(2,1)这六个点?
import numpy as np import matplotlib.pyplot as plt x = np.array([0, 1, 2]) # x: 横坐标的所有取值 y = np.array([0, 1]) # y: 纵坐标的所有取值 X, Y = np.meshgrid(x, y) # X: 按照纵坐标的取值数目,将x重复若干倍,得6个点的横坐标 # Y: 按照横坐标的取值数目,将y重复若干倍,得6个点的纵坐标 # (Xij,Yij) 分别表示一个点
3 numpy.ravel(): 将多维数组转换为一维数组
将上述X,Y展开后,纵向得到6个点的坐标
In [14]: x=np.array([[1,2],[3,4]]) # ravel函数在降维时默认是行序优先 In [17]: x.ravel() Out[17]: array([1, 2, 3, 4])
原始数据: Social_Network_Ads.csv (部分)
(1)导入库,加载数据
X = [Age, EstimatedSalary]
Y = [Purchased]
import numpy as np import matplotlib.pyplot as plt import pandas as pd dataset = pd.read_csv('Social_Network_Ads.csv') X = dataset.iloc[:,[2,3]].values Y = dataset.iloc[:,4].values
(2)将数据集分成训练集和测试集
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)
(3)特征缩放: 将数据 减去平均值 并 除以方差
from sklearn.preprocessing import StandardScaler sc = StandardScaler() X_train = sc.fit_transform(X_train) X_test = sc.transform(X_test)
(4)将逻辑回归应用于训练集
from sklearn.linear_model import LogisticRegression classifier = LogisticRegression() classifier.fit(X_train, Y_train)
(5)预测测试集结果
y_pred = classifier.predict(X_test)
(6)生成混淆矩阵
from sklearn.metrics import confusion_matrix cm = confusion_matrix(Y_test, y_pred)
由相关知识点可知,实际为0类的有63个测试样例被正确预测为0,3个被错误预测为1;实际为1类的有24个测试样例被正确预测为1,8个被错误预测为0;
(7)可视化
1: 显示红绿色背景
方法:在网格中采样足够多的点(类似于图片像素点),根据分类器分类的结果,将它们分别用红色和绿色显示出来。
代码:
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()) plt.show()
分析:
以0.01的步伐在X坐标上取点:
np.arange(start=X_set[:,0].min()-1, stop=X_set[:,0].max()+1, step=0.01)
以0.01的步伐在Y坐标上取点:
np.arange(start=X_set[:,1].min()-1, stop=X_set[:,1].max()+1, step = 0.01)
meshgrid 根据所有的X,Y坐标值生成所有对应点的横坐标矩阵X1,总坐标矩阵X2。
将X1,X2展开后进行转置,使得矩阵每一行元素表示一个点(由相关知识点可知),然后预测每个点的类别,将结果大小调整到和坐标数据相同的矩阵大小。
classifier.predict(np.array([X1.ravel(),X2.ravel()]).T).reshape(X1.shape)
最后使用contourf显示。
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()) plt.show()
2: 显示数据点
代码:
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)
分析:
获取Y_set中的所有类别“标记“ j 及其 索引 i
for i,j in enumerate(np.unique(Y_set)): print(i,j)
根据类别标记 j 获取所有类别为j的点的横坐标和纵坐标
X_set[Y_set==j,0],X_set[Y_set==j,1]
根据索引 i 选择不同的颜色,并显示类别标签
c = ListedColormap(('red','green'))(i), label=j)
最后画出对应的散点图
3:最后将1,2结合起来即可得最后的训练集效果图
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()
同理,可得测试集上的效果图
X_set,y_set=X_test,Y_test 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(Test set)') plt. xlabel(' Age') plt. ylabel(' Estimated Salary') plt. legend() plt. show()
逻辑回归
- 机器学习(二)逻辑回归
- 机器学习-softmax逻辑回归源码实现
- 机器学习-逻辑回归-参数迭代公式推导
- 机器学习逻辑回归:算法兑现为python代码
- 机器学习(二)广义线性模型:逻辑回归与Softmax分类
- 机器学习系列(1)_逻辑回归初步
- 机器学习-18:MachineLN之逻辑回归源码
- 机器学习-逻辑回归-分类
- 【机器学习笔记】逻辑回归
- 机器学习作业1 - 对率回归(逻辑回归)
- 机器学习之逻辑回归和softmax回归及代码示例
- 机器学习(二):逻辑回归
- <机器学习笔记-04 ><scikit-learn 04>逻辑回归
- 机器学习---逻辑回归
- 吴恩达机器学习笔记(2) 逻辑回归
- 机器学习入门(14)--逻辑回归(2)
- [机器学习入门] 李宏毅机器学习笔记-6 (Classification: Logistic Regression;逻辑回归)
- 【机器学习】逻辑回归(Logistic Regression)
- 机器学习(6)--创建逻辑回归分类器
- 机器学习——逻辑回归