共计 5823 个字符,预计需要花费 15 分钟才能阅读完成。
本文是机器学习系列的第三篇,算上前置机器学习系列是第八篇。本文的概念绝对简略,次要侧重于代码实际。
上一篇文章说到,咱们能够用线性回归做预测,但显然现实生活中不止有预测的问题还有分类的问题。咱们能够从预测值的类型上简略辨别:连续变量的预测为回归,离散变量的预测为分类。
一、逻辑回归:二分类
1.1 了解逻辑回归
咱们把间断的预测值进行人工定义,边界的一边定义为 1,另一边定义为 0。这样咱们就把回归问题转换成了分类问题。
如上图,咱们把间断的变量散布 压抑 在 0 - 1 的范畴内,并以 0.5 作为咱们分类决策的 边界,大于 0.5 的概率则判断为 1,小于 0.5 的概率则判断为 0。
咱们无奈应用无穷大和负无穷大进行算术运算,咱们通过逻辑回归函数(Sigmoid 函数 / S 型函数 /Logistic 函数)能够讲数值计算限定在 0 - 1 之间。
$$ \sigma(x) = \frac{1}{1+e^{-x}} $$
以上就是逻辑回归的简略解释。上面咱们利用实在的数据案例来进行二分类代码实际。
1.2 代码实际 – 导入数据集
增加援用:
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
导入数据集(大家不必在意这个域名):
df = pd.read_csv('https://blog.caiyongji.com/assets/hearing_test.csv')
df.head()
age | physical_score | test_result |
---|---|---|
33 | 40.7 | 1 |
50 | 37.2 | 1 |
52 | 24.7 | 0 |
56 | 31 | 0 |
35 | 42.9 | 1 |
该数据集,对 5000 名参与者进行了一项试验,以钻研年龄和身体健康对听力损失的影响,尤其是听低音的能力。此数据显示了钻研后果对参与者进行了身材能力的评估和评分,而后必须进行音频测试(通过 / 不通过),以评估他们听到高频的能力。
- 特色:1. 年龄 2. 衰弱得分
- 标签:(1 通过 / 0 不通过)
1.3 察看数据
sns.scatterplot(x='age',y='physical_score',data=df,hue='test_result')
咱们用 seaborn
绘制年龄和衰弱得分特色对应测试后果的散点图。
sns.pairplot(df,hue='test_result')
咱们通过 pairplot
办法绘制特色两两之间的对应关系。
咱们能够大抵做出判断,当年龄超过 60 很难通过测试,通过测试者广泛衰弱得分超过 30。
1.4 训练模型
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score,classification_report,plot_confusion_matrix
#筹备数据
X = df.drop('test_result',axis=1)
y = df['test_result']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=50)
scaler = StandardScaler()
scaled_X_train = scaler.fit_transform(X_train)
scaled_X_test = scaler.transform(X_test)
#定义模型
log_model = LogisticRegression()
#训练模型
log_model.fit(scaled_X_train,y_train)
#预测数据
y_pred = log_model.predict(scaled_X_test)
accuracy_score(y_test,y_pred)
咱们通过筹备数据,定义模型为 LogisticRegression
逻辑回归模型,通过 fit
办法拟合训练数据,最初通过 predict
办法进行预测。
最终咱们调用 accuracy_score
办法失去模型的准确率为 92.2%。
二、模型性能评估:准确率、精确度、召回率
咱们是如何失去准确率是 92.2% 的呢?咱们调用 plot_confusion_matrix
办法绘制混同矩阵。
plot_confusion_matrix(log_model,scaled_X_test,y_test)
咱们察看 500 个测试实例,失去矩阵如下:
咱们对以上矩阵进行定义如下:
- 真正类 TP(True Positive):预测为正,理论后果为正。如,上图右下角 285。
- 真负类 TN(True Negative):预测为负,理论后果为负。如,上图左上角 176。
- 假正类 FP(False Positive):预测为正,理论后果为负。如,上图左下角 19。
- 假负类 FN(False Negative):预测为负,理论后果为正。如,上图右上角 20。
准确率(Accuracy) 公式如下:
$$ Accuracy = \frac{TP+TN}{TP+TN+FP+FN} $$
带入本例得:
$$ Accuracy = \frac{285+176}{285+176+20+19} = 0.922 $$
精确度(Precision) 公式如下:
$$ Precision = \frac{TP}{TP+FP} $$
带入本例得:
$$ Precision = \frac{285}{285+19} = 0.9375 $$
召回率(Recall) 公式如下:
$$ Recall = \frac{TP}{TP+FN} $$
带入本例得:
$$ Recall = \frac{285}{285+20} = 0.934 $$
咱们调用 classification_report
办法可验证后果。
print(classification_report(y_test,y_pred))
三、Softmax:多分类
3.1 了解 softmax 多元逻辑回归
Logistic 回归和 Softmax 回归都是基于线性回归的分类模型,两者无本质区别,都是从伯努利分联合最大对数似然预计。
最大似然预计:简略来说,最大似然预计就是利用已知的样本后果信息,反推最具备可能(最大概率)导致这些样本后果呈现的模型参数值。
术语“概率”(probability)和“似然”(likelihood)在英语中常常调换应用,然而它们在统计学中的含意却大不相同。给定具备一些参数 θ 的统计模型,用“概率”一词形容将来的后果 x 的合理性(晓得参数值 θ),而用“似然”一词示意形容在晓得后果 x 之后,一组特定的参数值 θ 的合理性。
Softmax 回归模型首先计算出每个类的分数,而后对这些分数利用 softmax 函数,预计每个类的概率。咱们预测具备最高预计概率的类,简略来说就是找得分最高的类。
3.2 代码实际 – 导入数据集
导入数据集(大家不必在意这个域名):
df = pd.read_csv('https://blog.caiyongji.com/assets/iris.csv')
df.head()
sepal_length | sepal_width | petal_length | petal_width | species |
---|---|---|---|---|
5.1 | 3.5 | 1.4 | 0.2 | setosa |
4.9 | 3 | 1.4 | 0.2 | setosa |
4.7 | 3.2 | 1.3 | 0.2 | setosa |
4.6 | 3.1 | 1.5 | 0.2 | setosa |
5 | 3.6 | 1.4 | 0.2 | setosa |
该数据集,蕴含 150 个鸢尾花样本数据,数据特色蕴含花瓣的长度和宽度和萼片的长度和宽度,蕴含三个属种的鸢尾花,别离是山鸢尾 (setosa)、变色鸢尾(versicolor) 和维吉尼亚鸢尾(virginica)。
- 特色:1. 花萼长度 2. 花萼宽度 3. 花瓣长度 4 花萼宽度
- 标签 :品种:山鸢尾(setosa)、变色鸢尾(versicolor) 和维吉尼亚鸢尾(virginica)
3.3 察看数据
sns.scatterplot(x='sepal_length',y='sepal_width',data=df,hue='species')
咱们用 seaborn
绘制 花萼 长度和宽度特色对应鸢尾花品种的散点图。
sns.scatterplot(x='petal_length',y='petal_width',data=df,hue='species')
咱们用 seaborn
绘制 花瓣 长度和宽度特色对应鸢尾花品种的散点图。
sns.pairplot(df,hue='species')
咱们通过 pairplot
办法绘制特色两两之间的对应关系。
咱们能够大抵做出判断,综合思考花瓣和花萼尺寸最小的为山鸢尾花,中等尺寸的为变色鸢尾花,尺寸最大的为维吉尼亚鸢尾花。
3.4 训练模型
# 筹备数据
X = df.drop('species',axis=1)
y = df['species']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=50)
scaler = StandardScaler()
scaled_X_train = scaler.fit_transform(X_train)
scaled_X_test = scaler.transform(X_test)
#定义模型
softmax_model = LogisticRegression(multi_class="multinomial",solver="lbfgs", C=10, random_state=50)
#训练模型
softmax_model.fit(scaled_X_train,y_train)
#预测数据
y_pred = softmax_model.predict(scaled_X_test)
accuracy_score(y_test,y_pred)
咱们通过筹备数据,定义模型 LogisticRegression
的multi_class="multinomial"
多元逻辑回归模型,设置求解器为 lbfgs
,通过fit
办法拟合训练数据,最初通过 predict
办法进行预测。
最终咱们调用 accuracy_score
办法失去模型的准确率为 92.1%。
咱们调用 classification_report
办法查看准确率、精确度、召回率。
print(classification_report(y_test,y_pred))
3.5 拓展:绘制花瓣分类
咱们仅提取花瓣长度和花瓣宽度的特色来绘制鸢尾花的分类图像。
# 提取特色
X = df[['petal_length','petal_width']].to_numpy()
y = df["species"].factorize(['setosa', 'versicolor','virginica'])[0]
#定义模型
softmax_reg = LogisticRegression(multi_class="multinomial",solver="lbfgs", C=10, random_state=50)
#训练模型
softmax_reg.fit(X, y)
#随机测试数据
x0, x1 = np.meshgrid(np.linspace(0, 8, 500).reshape(-1, 1),
np.linspace(0, 3.5, 200).reshape(-1, 1),
)
X_new = np.c_[x0.ravel(), x1.ravel()]
#预测
y_proba = softmax_reg.predict_proba(X_new)
y_predict = softmax_reg.predict(X_new)
#绘制图像
zz1 = y_proba[:, 1].reshape(x0.shape)
zz = y_predict.reshape(x0.shape)
plt.figure(figsize=(10, 4))
plt.plot(X[y==2, 0], X[y==2, 1], "g^", label="Iris virginica")
plt.plot(X[y==1, 0], X[y==1, 1], "bs", label="Iris versicolor")
plt.plot(X[y==0, 0], X[y==0, 1], "yo", label="Iris setosa")
from matplotlib.colors import ListedColormap
custom_cmap = ListedColormap(['#fafab0','#9898ff','#a0faa0'])
plt.contourf(x0, x1, zz, cmap=custom_cmap)
contour = plt.contour(x0, x1, zz1, cmap=plt.cm.brg)
plt.clabel(contour, inline=1, fontsize=12)
plt.xlabel("Petal length", fontsize=14)
plt.ylabel("Petal width", fontsize=14)
plt.legend(loc="center left", fontsize=14)
plt.axis([0, 7, 0, 3.5])
plt.show()
失去鸢尾花依据花瓣分类的图像如下:
四、小结
相比于概念的了解,本文更偏重上手实际,通过入手编程你应该有“手热”的感觉了。截至到本文,你应该对机器学习的概念有了肯定的把握,咱们简略梳理一下:
- 机器学习的分类
- 机器学习的工业化流程
- 特色、标签、实例、模型的概念
- 过拟合、欠拟合
- 损失函数、最小二乘法
- 梯度降落、学习率
7. 线性回归、逻辑回归、多项式回归、逐步回归、岭回归、套索 (Lasso) 回归、弹性网络 (ElasticNet) 回归是最罕用的回归技术
- Sigmoid 函数、Softmax 函数、最大似然预计
如果你还有不分明的中央请参考:
- 机器学习(二):了解线性回归与梯度降落并做简略预测
- 机器学习(一):5 分钟了解机器学习并上手实际
- 前置机器学习(五):30 分钟把握罕用 Matplotlib 用法
- 前置机器学习(四):一文把握 Pandas 用法
- 前置机器学习(三):30 分钟把握罕用 NumPy 用法
- 前置机器学习(二):30 分钟把握罕用 Jupyter Notebook 用法
- 前置机器学习(一):数学符号及希腊字母