【机器学习个人笔记】part5——用sklearn实现逻辑回归

本文是机器学习个人笔记第五部分,通过sklearn实现逻辑回归预测用户是否购买SUV。数据预处理后,构建逻辑回归模型,得到89%的准确率。并介绍了混淆矩阵的概念和应用,用于评估模型性能。

【机器学习个人笔记】part5——用sklearn实现逻辑回归

逻辑回归虽然名字是“回归”,但实际是“分类“,如图所示就是最简单的逻辑回归:

实例:

场景:根据用户的年龄、薪水来预测其是否购买SUV

数据集:


简单分析一下这个数据集,第一列是用户id,第二列是用户性别,本次实验不考虑这两个特征。我们希望通过根据用户的年龄和薪水预测用户是否会购买SUV,根据预测结果对用户进行针对性推销。那么agesalary将是我们自变量Xpurchased则是我们的因变量y

代码:

  1. 数据预处理(导入标准库,导入数据集,分割训练集和测试集,特征缩放)
# 导入标准库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 导入数据集
dataset = pd.read_csv("Social_Network_Ads.csv")
X = dataset.iloc[:,[2,3]].values
y = dataset.iloc[:,-1].values

# 分割训练集和测试集
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)

# 特征缩放
from sklearn.preprocessing import StandardScaler
sc_x = StandardScaler()
sc_x.fit(X)
X_train = sc_x.transform(X_train)
X_test = sc_x.transform(X_test)

特征缩放也可以放在分割前面

  1. 构建逻辑回归模型,并用拟合好的模型进行预测
# 用训练集去拟合逻辑回归模型
from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression(random_state = 0)
classifier.fit(X_train, y_train)

# 用拟合好的模型去预测
y_pred = classifier.predict(X_test)

这里用到了sklearn中linear_model 中的LogisticRegression类

  1. 创建混淆矩阵来评估模型
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)

混淆矩阵结果:

由此可以看出,其准确率 = (65 + 24 ) / 100 = 89%
什么是混淆矩阵?下面会进行拓展.

  1. 可视化训练集和测试集
# 可视化训练集
# Visualising the Training set results
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(('orange', 'blue'))(i), label = j)
plt.title = 'Logistic Regression (Training set)'
plt.xlabel = 'Age'
plt.ylabel = 'Estimated Salary'
plt.legend()
plt.show()


# Visualising the Test set results
from matplotlib.colors import ListedColormap
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(('orange', 'blue'))(i), label = j)
plt.title = 'Logistic Regression (Test set)'
plt.xlabel = 'Age'
plt.ylabel = 'Estimated Salary'
plt.legend()
plt.show()

训练集:

测试集:

横轴代表用户的年龄,纵轴代表用户的用户的薪水,图中的每一个点代表一个用户,橙色的点代表用户没有购买SUV,蓝色的点代表用户购买了SUV。
由图上的点可知,用户是否购买SUV,和年龄、薪水有非常大的关系,年龄大且薪水高的用户购买SUV的概率大,年龄小企且薪水低的用户购买SUV的概率小,但也存在特例。
可以看出其结果大致呈现一个线性可分的关系,我们的线性逻辑分类器能够较好的对新用户进行预测,并且准确率达到了89%。

下次我会给大家介绍更多的分类模型

完整代码


拓展——混淆矩阵confusion matrix

Confusion Matrix

在机器学习领域,混淆矩阵(confusion matrix),又称为可能性表格或是错误矩阵。它是一种特定的矩阵用来呈现算法性能的可视化效果,通常是监督学习(非监督学习,通常用匹配矩阵:matching matrix)。其每一列代表预测值,每一行代表的是实际的类别。这个名字来源于它可以非常容易的表明多个类别是否有混淆(也就是一个class被预测成另一个class)。

Example

假设有一个用来对猫(cats)、狗(dogs)、兔子(rabbits)进行分类的系统,混淆矩阵就是为了进一步分析性能而对该算法测试结果做出的总结。假设总共有 27 只动物:8只猫, 6条狗, 13只兔子。结果的混淆矩阵如下图:

在这个混淆矩阵中,实际有 8只猫,但是系统将其中3只预测成了狗;对于 6条狗,其中有 1条被预测成了兔子,2条被预测成了猫。从混淆矩阵中我们可以看出系统对于区分猫和狗存在一些问题,但是区分兔子和其他动物的效果还是不错的。所有正确的预测结果都在对角线上,所以从混淆矩阵中可以很方便直观的看出哪里有错误,因为他们呈现在对角线外面。

Table of confusion

在预测分析中,混淆表格(有时候也称为混淆矩阵),是由false positives,falsenegatives,true positives和true negatives组成的两行两列的表格。它允许我们做出更多的分析,而不仅仅是局限在正确率。准确率对于分类器的性能分析来说,并不是一个很好地衡量指标,因为如果数据集不平衡(每一类的数据样本数量相差太大),很可能会出现误导性的结果。例如,如果在一个数据集中有95只猫,但是只有5条狗,那么某些分类器很可能偏向于将所有的样本预测成猫。整体准确率为95%,但是实际上该分类器对猫的识别率是100%,而对狗的识别率是0%。
对于上面的混淆矩阵,其对应的对猫这个类别的混淆表格如下:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值