关于机器学习:机器学习算法一-基于逻辑回归的分类预测

38次阅读

共计 10715 个字符,预计需要花费 27 分钟才能阅读完成。

机器学习算法(一): 基于逻辑回归的分类预测

我的项目链接参考:https://www.heywhale.com/home/column/64141d6b1c8c8b518ba97dcc

1 逻辑回归的介绍和利用

1.1 逻辑回归的介绍

逻辑回归(Logistic regression,简称 LR)尽管其中带有 ” 回归 ” 两个字,但逻辑回归其实是一个 分类 模型,并且广泛应用于各个领域之中。尽管当初深度学习绝对于这些传统办法更为炽热,但实则这些传统办法因为其独特的劣势仍然广泛应用于各个领域中。

而对于逻辑回归而且,最为突出的两点就是其 模型简略 模型的可解释性强

逻辑回归模型的优劣势:

  • 长处:实现简略,易于了解和实现;计算代价不高,速度很快,存储资源低;
  • 毛病:容易欠拟合,分类精度可能不高

1.1 逻辑回归的利用

逻辑回归模型宽泛用于各个领域,包含机器学习,大多数医学畛域和社会科学。例如,最后由 Boyd 等人开发的创伤和伤害重大度评分(TRISS)被宽泛用于预测受伤患者的死亡率,应用逻辑回归 基于察看到的患者特色(年龄,性别,体重指数, 各种血液查看的后果等)剖析预测产生特定疾病(例如糖尿病,冠心病)的危险。逻辑回归模型也用于预测在给定的过程中,零碎或产品的故障的可能性。还用于市场营销应用程序,例如预测客户购买产品或停止订购的偏向等。在经济学中它能够用来预测一个人抉择进入劳动力市场的可能性,而商业利用则能够用来预测房主拖欠抵押贷款的可能性。条件随机字段是逻辑回归到程序数据的扩大,用于自然语言解决。

逻辑回归模型当初同样是很多分类算法的根底组件, 比方 分类工作中基于 GBDT 算法 +LR 逻辑回归实现的信用卡交易反欺诈,CTR(点击通过率)预估等,其益处在于输入值天然地落在 0 到 1 之间,并且有概率意义。模型清晰,有对应的概率学实践根底。它拟合进去的参数就代表了每一个特色 (feature) 对后果的影响。也是一个了解数据的好工具。但同时因为其本质上是一个线性的分类器,所以不能应答较为简单的数据状况。很多时候咱们也会拿逻辑回归模型去做一些工作尝试的基线(根底程度)。

说了这些逻辑回归的概念和利用,大家应该曾经对其有所期待了吧,那么咱们当初开始吧!!!

2 学习指标

  • 理解 逻辑回归 的实践
  • 把握 逻辑回归 的 sklearn 函数调用应用并将其使用到鸢尾花数据集预测

3 代码流程

  • Part1 Demo 实际
    • Step1: 库函数导入
    • Step2: 模型训练
    • Step3: 模型参数查看
    • Step4: 数据和模型可视化
    • Step5: 模型预测
  • Part2 基于鸢尾花(iris)数据集的逻辑回归分类实际
    • Step1: 库函数导入
    • Step2: 数据读取 / 载入
    • Step3: 数据信息简略查看
    • Step4: 可视化形容
    • Step5: 利用 逻辑回归模型 在二分类上 进行训练和预测
    • Step5: 利用 逻辑回归模型 在三分类 (多分类) 上 进行训练和预测

4 算法实战

### 4.1 Demo 实际
Step1: 库函数导入

##  根底函数库
import numpy as np 

## 导入画图库
import matplotlib.pyplot as plt
import seaborn as sns

## 导入逻辑回归模型函数
from sklearn.linear_model import LogisticRegression

Step2: 模型训练

##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()

## 用逻辑回归模型拟合结构的数据集
lr_clf = lr_clf.fit(x_fearures, y_label) #其拟合方程为 y=w0+w1*x1+w2*x2

Step3: 模型参数查看

## 查看其对应模型的 w
print('the weight of Logistic Regression:',lr_clf.coef_)

## 查看其对应模型的 w0
print('the intercept(w0) of Logistic Regression:',lr_clf.intercept_)

the weight of Logistic Regression: [[0.73455784 0.69539712]]
the intercept(w0) of Logistic Regression: [-0.13139986]

Step4: 数据和模型可视化

## 可视化结构的数据样本点
plt.figure()
plt.scatter(x_fearures[:,0],x_fearures[:,1], c=y_label, s=50, cmap='viridis')
plt.title('Dataset')
plt.show()

# 可视化决策边界
plt.figure()
plt.scatter(x_fearures[:,0],x_fearures[:,1], c=y_label, s=50, cmap='viridis')
plt.title('Dataset')

nx, ny = 200, 100
x_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], linewidths=2., colors='blue')

plt.show()

### 可视化预测新样本

plt.figure()
## new point 1
x_fearures_new1 = np.array([[0, -1]])
plt.scatter(x_fearures_new1[:,0],x_fearures_new1[:,1], s=50, cmap='viridis')
plt.annotate(s='New point 1',xy=(0,-1),xytext=(-2,0),color='blue',arrowprops=dict(arrowstyle='-|>',connectionstyle='arc3',color='red'))

## new point 2
x_fearures_new2 = np.array([[1, 2]])
plt.scatter(x_fearures_new2[:,0],x_fearures_new2[:,1], s=50, cmap='viridis')
plt.annotate(s='New point 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()

Step5: 模型预测

## 在训练集和测试集上别离利用训练好的模型进行预测
y_label_new1_predict = lr_clf.predict(x_fearures_new1)
y_label_new2_predict = lr_clf.predict(x_fearures_new2)

print('The New point 1 predict class:\n',y_label_new1_predict)
print('The New point 2 predict class:\n',y_label_new2_predict)

## 因为逻辑回归模型是概率预测模型(前文介绍的 p = p(y=1|x,\theta)), 所以咱们能够利用 predict_proba 函数预测其概率
y_label_new1_predict_proba = lr_clf.predict_proba(x_fearures_new1)
y_label_new2_predict_proba = lr_clf.predict_proba(x_fearures_new2)

print('The New point 1 predict Probability of each class:\n',y_label_new1_predict_proba)
print('The New point 2 predict Probability of each class:\n',y_label_new2_predict_proba)

The New point 1 predict class:
 [0]
The New point 2 predict class:
 [1]
The New point 1 predict Probability of each class:
 [[0.69567724 0.30432276]]
The New point 2 predict Probability of each class:
 [[0.11983936 0.88016064]]

能够发现训练好的回归模型将 X_new1 预测为了类别 0(判断面左下侧),X_new2 预测为了类别 1(判断面右上侧)。其训练失去的逻辑回归模型的概率为 0.5 的判断面为上图中蓝色的线。

4.2 基于鸢尾花(iris)数据集的逻辑回归分类实际

在实际的最开始,咱们首先须要导入一些根底的函数库包含:numpy(Python 进行科学计算的根底软件包),pandas(pandas 是一种疾速,弱小,灵便且易于应用的开源数据分析和解决工具),matplotlib 和 seaborn 绘图。
Step1: 库函数导入

##  根底函数库
import numpy as np 
import pandas as pd

## 绘图函数库
import matplotlib.pyplot as plt
import seaborn as sns

本次咱们抉择鸢花数据(iris)进行办法的尝试训练,该数据集一共蕴含 5 个变量,其中 4 个特色变量,1 个指标分类变量。共有 150 个样本,指标变量为 花的类别 其都属于鸢尾属下的三个亚属,别离是山鸢尾 (Iris-setosa),变色鸢尾 (Iris-versicolor) 和维吉尼亚鸢尾(Iris-virginica)。蕴含的三种鸢尾花的四个特色,别离是花萼长度(cm)、花萼宽度(cm)、花瓣长度(cm)、花瓣宽度(cm),这些状态特色在过来被用来辨认物种。

变量 形容
sepal length 花萼长度(cm)
sepal width 花萼宽度(cm)
petal length 花瓣长度(cm)
petal width 花瓣宽度(cm)
target 鸢尾的三个亚属类别,’setosa'(0), ‘versicolor'(1), ‘virginica'(2)

Step2: 数据读取 / 载入

## 咱们利用 sklearn 中自带的 iris 数据作为数据载入,并利用 Pandas 转化为 DataFrame 格局
from sklearn.datasets import load_iris
data = load_iris() #失去数据特色
iris_target = data.target #失去数据对应的标签
iris_features = pd.DataFrame(data=data.data, columns=data.feature_names) #利用 Pandas 转化为 DataFrame 格局

Step3: 数据信息简略查看

## 利用.info()查看数据的整体信息
iris_features.info()

#   Column             Non-Null Count  Dtype  
---  ------             --------------  -----  
 0   sepal length (cm)  150 non-null    float64
 1   sepal width (cm)   150 non-null    float64
 2   petal length (cm)  150 non-null    float64
 3   petal width (cm)   150 non-null    float64
dtypes: float64(4)
memory usage: 4.8 KB

## 对于特色进行一些统计形容
iris_features.describe()

    sepal length (cm)    sepal width (cm)    petal length (cm)    petal width (cm)
count    150.000000    150.000000    150.000000    150.000000
mean    5.843333    3.057333    3.758000    1.199333
std    0.828066    0.435866    1.765298    0.762238
min    4.300000    2.000000    1.000000    0.100000
25%    5.100000    2.800000    1.600000    0.300000
50%    5.800000    3.000000    4.350000    1.300000
75%    6.400000    3.300000    5.100000    1.800000
max    7.900000    4.400000    6.900000    2.500000

Step4: 可视化形容

## 合并标签和特色信息
iris_all = iris_features.copy() ## 进行浅拷贝,避免对于原始数据的批改
iris_all['target'] = iris_target

## 特色与标签组合的散点可视化
sns.pairplot(data=iris_all,diag_kind='hist', hue= 'target')
plt.show()

从上图能够发现,在 2D 状况下不同的特色组合对于不同类别的花的散点散布,以及大略的辨别能力。

for col in iris_features.columns:
    sns.boxplot(x='target', y=col, saturation=0.5,palette='pastel', data=iris_all)
    plt.title(col)
    plt.show()

利用箱型图咱们也能够失去不同类别在不同特色上的散布差别状况。

# 选取其前三个特色绘制三维散点图
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize=(10,8))
ax = fig.add_subplot(111, projection='3d')

iris_all_class0 = iris_all[iris_all['target']==0].values
iris_all_class1 = iris_all[iris_all['target']==1].values
iris_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()

Step5: 利用 逻辑回归模型 在二分类上 进行训练和预测

## 为了正确评估模型性能,将数据划分为训练集和测试集,并在训练集上训练模型,在测试集上验证模型性能。from sklearn.model_selection import train_test_split

## 抉择其类别为 0 和 1 的样本(不包含类别为 2 的样本)iris_features_part = iris_features.iloc[:100]
iris_target_part = iris_target[:100]

## 测试集大小为 20%,80%/20% 分
x_train, x_test, y_train, y_test = train_test_split(iris_features_part, iris_target_part, test_size = 0.2, random_state = 2020)

## 从 sklearn 中导入逻辑回归模型
from sklearn.linear_model import LogisticRegression

## 定义 逻辑回归模型 
clf = LogisticRegression(random_state=0, solver='lbfgs')

# 在训练集上训练逻辑回归模型
clf.fit(x_train, y_train)

## 查看其对应的 w
print('the weight of Logistic Regression:',clf.coef_)

## 查看其对应的 w0
print('the intercept(w0) of Logistic Regression:',clf.intercept_)

## 在训练集和测试集上散布利用训练好的模型进行预测
train_predict = clf.predict(x_train)
test_predict = clf.predict(x_test)

from sklearn import metrics

## 利用 accuracy(准确度)【预测正确的样本数目占总预测样本数目标比例】评估模型成果
print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_train,train_predict))
print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_test,test_predict))

## 查看混同矩阵 (预测值和实在值的各类状况统计矩阵)
confusion_matrix_result = metrics.confusion_matrix(test_predict,y_test)
print('The confusion matrix result:\n',confusion_matrix_result)

# 利用热力求对于后果进行可视化
plt.figure(figsize=(8, 6))
sns.heatmap(confusion_matrix_result, annot=True, cmap='Blues')
plt.xlabel('Predicted labels')
plt.ylabel('True labels')
plt.show()

The accuracy of the Logistic Regression is: 1.0
The accuracy of the Logistic Regression is: 1.0
The confusion matrix result:
[[9 0]
[0 11]]

咱们能够发现其准确度为 1,代表所有的样本都预测正确了。

Step6: 利用 逻辑回归模型 在三分类 (多分类) 上 进行训练和预测

## 测试集大小为 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)

## 查看其对应的 w
print('the weight of Logistic Regression:\n',clf.coef_)

## 查看其对应的 w0
print('the intercept(w0) of Logistic Regression:\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('The test predict Probability of each class:\n',test_predict_proba)
## 其中第一列代表预测为 0 类的概率,第二列代表预测为 1 类的概率,第三列代表预测为 2 类的概率。## 利用 accuracy(准确度)【预测正确的样本数目占总预测样本数目标比例】评估模型成果
print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_train,train_predict))
print('The accuracy of the Logistic Regression is:',metrics.accuracy_score(y_test,test_predict))
 [9.35695863e-01 6.43039513e-02 1.85301359e-07]
 [9.80621190e-01 1.93787400e-02 7.00125246e-08]
 [1.68478815e-04 3.30167226e-01 6.69664295e-01]
 [3.54046163e-03 4.02267805e-01 5.94191734e-01]
 [9.70617284e-01 2.93824740e-02 2.42443967e-07]
...
 [9.64848137e-01 3.51516748e-02 1.87917880e-07]
 [9.70436779e-01 2.95624025e-02 8.18591606e-07]]
The accuracy of the Logistic Regression is: 0.9833333333333333
The accuracy of the Logistic Regression is: 0.8666666666666667
## 查看混同矩阵
confusion_matrix_result = metrics.confusion_matrix(test_predict,y_test)
print('The confusion matrix result:\n',confusion_matrix_result)

# 利用热力求对于后果进行可视化
plt.figure(figsize=(8, 6))
sns.heatmap(confusion_matrix_result, annot=True, cmap='Blues')
plt.xlabel('Predicted labels')
plt.ylabel('True labels')
plt.show()

通过后果咱们能够发现,其在三分类的后果的预测准确度上有所降落,其在测试集上的准确度为:$86.67\%$,这是因为 ’versicolor’(1)和 ‘virginica’(2)这两个类别的特色,咱们从可视化的时候也能够发现,其特色的边界具备肯定的模糊性(边界类别混淆,没有显著辨别边界),所有在这两类的预测上呈现了肯定的谬误。

5 重要知识点

逻辑回归 原理简介:

Logistic 回归尽管名字里带“回归”,然而它实际上是一种分类办法,次要用于两分类问题(即输入只有两种,别离代表两个类别),所以利用了 Logistic 函数(或称为 Sigmoid 函数),函数模式为:

$$
logi(z)=\frac{1}{1+e^{-z}}
$$

其对应的函数图像能够示意如下:

import numpy as np
import matplotlib.pyplot as plt
x = 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()

通过上图咱们能够发现 Logistic 函数是枯燥递增函数,并且在 z = 0 的时候取值为 0.5,并且 $logi(\cdot)$ 函数的取值范畴为 $(0,1)$。

而回归的根本方程为 $z=w_0+\sum_i^N w_ix_i$,

将回归方程写入其中为:

$$
p = p(y=1|x,\theta) = h_\theta(x,\theta)=\frac{1}{1+e^{-(w_0+\sum_i^N w_ix_i)}}
$$

所以, $p(y=1|x,\theta) = h_\theta(x,\theta)$,$p(y=0|x,\theta) = 1-h_\theta(x,\theta)$

逻辑回归从其原理上来说,逻辑回归其实是实现了一个决策边界:对于函数 $y=\frac{1}{1+e^{-z}}$, 当 $z=>0$ 时,$y=>0.5$, 分类为 1,当 $z<0$ 时,$y<0.5$, 分类为 0,其对应的 $y$ 值咱们能够视为类别 1 的概率预测值.

对于模型的训练而言:本质上来说就是利用数据求解出对应的模型的特定的 $w$。从而失去一个针对于以后数据的特色逻辑回归模型。

而对于多分类而言,将多个二分类的逻辑回归组合,即可实现多分类。

正文完
 0