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

对于逻辑回归最为突出的两点就是其模型简单和模型的可解释性强。
逻辑回归模型的优劣势:
优点:实现简单,易于理解和实现;计算代价不高,速度很快,存储资源低;
缺点:容易欠拟合,分类精度可能不高

学习目标

了解 逻辑回归 的理论
掌握 逻辑回归 的 sklearn 函数调用使用并将其运用到鸢尾花数据集预测

代码流程

Part1 Demo实践
Step1:库函数导入
Step2:模型训练
Step3:模型参数查看
Step4:数据和模型可视化
Step5:模型预测

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

算法实践

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

## 在训练集和测试集上分别利用训练好的模型进行预测
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的判别面为上图中蓝色的线

基于鸢尾花(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()--
<class 'pandas.core.frame.DataFrame'>RangeIndex: 150 entries, 0 to 149Data columns (total 4 columns):#   Column             Non-Null Count  Dtype  ---  ------             --------------  -----  0   sepal length (cm)  150 non-null    float641   sepal width (cm)   150 non-null    float642   petal length (cm)  150 non-null    float643   petal width (cm)   150 non-null    float64dtypes: float64(4)memory usage: 4.8 KB
## 进行简单的数据查看,我们可以利用 .head() 头部.tail()尾部
iris_features.head()--
sepal length (cm)   sepal width (cm)    petal length (cm)   petal width (cm)
0   5.1 3.5 1.4 0.2
1   4.9 3.0 1.4 0.2
2   4.7 3.2 1.3 0.2
3   4.6 3.1 1.5 0.2
4   5.0 3.6 1.4 0.2
iris_features.tail()--
sepal length (cm)   sepal width (cm)    petal length (cm)   petal width (cm)
145 6.7 3.0 5.2 2.3
146 6.3 2.5 5.0 1.9
147 6.5 3.0 5.2 2.0
148 6.2 3.4 5.4 2.3
149 5.9 3.0 5.1 1.8
## 其对应的类别标签为,其中0,1,2分别代表'setosa', 'versicolor', 'virginica'三种不同花的类别。
iris_targetarray([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
,       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
,       0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
,       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
,       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
,       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
,       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
## 利用value_counts函数查看每个类别数量
pd.Series(iris_target).value_counts()2    50
,1    50
,0    50
,dtype: int64
## 对于特征进行一些统计描述
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()

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 Axes3Dfig = 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)--
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
,                   intercept_scaling=1, l1_ratio=None, max_iter=100,
,                   multi_class='auto', n_jobs=None, penalty='l2',
,                   random_state=0, solver='lbfgs', tol=0.0001, verbose=0,
,                   warm_start=False)
## 查看其对应的w
print('the weight of Logistic Regression:',clf.coef_)## 查看其对应的w0
print('the intercept(w0) of Logistic Regression:',clf.intercept_)
--
the weight of Logistic Regression: [[ 0.45181973 -0.81743611  2.14470304  0.89838607]]
the intercept(w0) of Logistic Regression: [-6.53367714]
## 在训练集和测试集上分布利用训练好的模型进行预测
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()


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


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


通过结果我们可以发现,其在三分类的结果的预测准确度上有所下降,其在测试集上的准确度为: 86.67%,这是由于’versicolor’(1)和 ‘virginica’(2)这两个类别的特征,我们从可视化的时候也可以发现,其特征的边界具有一定的模糊性(边界类别混杂,没有明显区分边界),所有在这两类的预测上出现了一定的错误。

重要知识点

逻辑回归 原理简介:

Logistic回归虽然名字里带“回归”,但是它实际上是一种分类方法,主要用于两分类问题(即输出只有两种,分别代表两个类别),所以利用了Logistic函数(或称为Sigmoid函数),函数形式为:

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

其对应的函数图像可以表示如下:



end

阿里云天池龙珠计划 机器学习篇---stack09相关推荐

  1. 阿里云天池龙珠计划 机器学习篇---stack11

    LightGBM LightGBM的主要优点: 简单易用.提供了主流的Python\C++\R语言接口,用户可以轻松使用LightGBM建模并获得相当不错的效果. 高效可扩展.在处理大规模数据集时高效 ...

  2. 阿里云天池龙珠计划 sql篇---stack06

    视图 1.什么是视图 视图是一个虚拟的表,不同于直接操作数据表,视图是依据SELECT语句来创建的(会在下面具体介绍),所以操作视图时会根据创建视图的SELECT语句生成一张虚拟表,然后在这张虚拟表上 ...

  3. 【学习笔记】阿里云天池龙珠计划SQL训练营-Task06:综合练习题-10道经典题目

    本笔记为阿里云天池龙珠计划SQL训练营的学习内容 链接为:https://tianchi.aliyun.com/specials/promotion/aicampsql 练习题1: 请使用A股上市公司 ...

  4. 本笔记为阿里云天池龙珠计划SQL训练营的学习内容,链接为:https://tianchi.aliyun.com/specials/promotion/aicampsql” Task06学习笔记

    本笔记为阿里云天池龙珠计划SQL训练营的学习内容,链接为:https://tianchi.aliyun.com/specials/promotion/aicampsql" Task06学习笔 ...

  5. 阿里云天池龙珠计划SQL训练营Task03:复杂查询方法-视图、子查询、函数等

    本笔记为阿里云天池龙珠计划SQL训练营的学习内容,链接为:https://tianchi.aliyun.com/specials/promotion/aicampsql: 3.1 视图 我们先来看一个 ...

  6. 【阿里云天池龙珠计划SQL训练营】SQL复习Task3

    本笔记为阿里云天池龙珠计划SQL训练营的学习内容,链接为:https://tianchi.aliyun.com/specials/promotion/aicampsql: 目录 Task03:复杂查询 ...

  7. 【阿里云天池龙珠计划SQL训练营】SQL复习Task2

    本笔记为阿里云天池龙珠计划SQL训练营的学习内容,链接为:https://tianchi.aliyun.com/specials/promotion/aicampsql: 目录 Task02:SQL基 ...

  8. 阿里云天池龙珠计划SQL训练营Task 1:初识数据库与SQL

    本笔记为阿里云天池龙珠计划SQL训练营的学习内容,链接为:https://tianchi.aliyun.com/specials/promotion/aicampsql: 一.初识数据库 数据库是将大 ...

  9. 阿里云天池龙珠计划SQL训练营Task04:集合运算-表的加减法和join等

    本笔记为阿里云天池龙珠计划SQL训练营的学习内容,链接为:https://tianchi.aliyun.com/specials/promotion/aicampsql: 4.1表的加减法 4.1.1 ...

最新文章

  1. doe全称是什么意思_BVV线和RVV都是护套线,二者有什么区别?【辽宁津达线缆】...
  2. 【2021斯坦福新书】统计学思维,300页pdf
  3. 一文读懂AI简史:当年各国烧钱许下的愿,有些至今仍未实现
  4. 2021年春季学期-信号与系统-第七次作业参考答案-第五小题
  5. oracle 多个实例互相切换实例
  6. Ajax-个人学习记录(2)
  7. 计算机网络原理第一章习题3-24 3-25
  8. 加密和解密算法的兩個實現
  9. Nginx软件优化【转】
  10. idea的tomcat实现热部署遇到的问题
  11. kubernetes视频教程笔记 (38)-高可用的K8S构建-系统初始化
  12. NHibernate one-to-one 关系的几点说明
  13. oracle如何验证导入完整,关于Oracle 9i导入/导出效果的测试报告
  14. 移动硬盘显示拒绝访问文件怎样找到
  15. 两栏 论文首页 插尾注方法 word2019
  16. android orientation 代码,android常见错误之Wrong orientation? No orientation specified
  17. 郦旭东小可爱的大数据算法课程期末复习
  18. ASP微信支付之扫码支付
  19. 郑州大学本科生毕业论文latex模板
  20. 小程序请求后端接口步骤

热门文章

  1. windows 10 系统重装教程
  2. 完美,这个世界上根本就没有完美的东西
  3. 用easybcd引导ubuntu却进入grub命令行的遭遇与解决
  4. 如何安装Windows7操作系统
  5. 计算机毕业设计Java的影视资讯管理系统(源码+系统+mysql数据库+lw文档)
  6. 接水果(fruit)
  7. windows系统用cx_freeze给python程序打包成exe可执行文件
  8. HTML5,图片边框,.9效果处理
  9. [NOIP2004]津津的储蓄计划
  10. work group和domain的区别