Task01:逻辑回归的理论--阿里云天池

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

Step1:库函数导入
基础函数库

import numpy as np 
import pandas as pd

绘图函数库

import matplotlib.pyplot as plt
import seaborn as sns

其中:numpy (Python进行科学计算的基础软件包),pandas(pandas是一种快速,强大,灵活且易于使用的开源数据分析和处理工具),matplotlib和seaborn绘图。seaborn就是在matplotlib基础上面的封装,方便直接传参数调用。Matplotlib 是 Python 的绘图库。 它可与 NumPy 一起使用,提供了一种有效的 MatLab 开源替代方案。 它也可以和图形工具包一起使用,如 PyQt 和 wxPython。

本次鸢尾花的相关数据信息:

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

该数据集一共包含5个变量,其中4个特征变量,1个目标分类变量。共有150个样本。我们将通过这4个特征变量来对其进行类别识别,判断属于哪一种亚种。

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

output:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150 entries, 0 to 149
Data columns (total 4 columns):
 #   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

进行简单的数据查看,我们可以利用 .head() 头部.tail()尾部

iris_features.head()

output:
在这里插入图片描述

iris_features.tail()

在这里插入图片描述
其对应的类别标签为,其中0,1,2分别代表’setosa’, ‘versicolor’, 'virginica’三种不同花的类别。

iris_target

output:

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

ouput:

2    50
1    50
0    50
dtype: int64

对于特征进行一些统计描述

iris_features.describe()

output:
在这里插入图片描述
从上面表格可以看到鸢尾花不同特征值的平均值,标准差,最小值等。

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

output:

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

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

## 由于这个是3分类,所有我们这里得到了三个逻辑回归模型的参数,其三个逻辑回归组合起来即可实现三分类。

output:

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

output:
在这里插入图片描述
从上图可以看到实际标签为0的9个样本和实际标签为1的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分类,所有我们这里得到了三个逻辑回归模型的参数,其三个逻辑回归组合起来即可实现三分类

output:

the weight of Logistic Regression:
 [[-0.45928925  0.83069889 -2.2660653  -0.99743982]
 [ 0.33117319 -0.72863425 -0.06841147 -0.98711029]
 [ 0.12811606 -0.10206465  2.33447677  1.98455011]]
the intercept(w0) of Logistic Regression:
 [  9.43880663   3.93047365 -13.36928027]
## 在训练集和测试集上分布利用训练好的模型进行预测
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))

output:

The test predict Probability of each class:
 [[1.03461739e-05 2.33279479e-02 9.76661706e-01]
 [9.69926591e-01 3.00732873e-02 1.21677005e-07]
 [2.09992551e-02 8.69156615e-01 1.09844130e-01]
 [3.61934875e-03 7.91979965e-01 2.04400686e-01]
 [7.90943216e-03 8.00605298e-01 1.91485270e-01]
 [7.30034951e-04 6.60508053e-01 3.38761912e-01]
 [1.68614212e-04 1.86322046e-01 8.13509340e-01]
 [1.06915330e-01 8.90815533e-01 2.26913676e-03]
 [9.46928072e-01 5.30707282e-02 1.20016062e-06]
 [9.62346386e-01 3.76532223e-02 3.91897306e-07]
 [1.19533389e-04 1.38823469e-01 8.61056997e-01]
 [8.78881877e-03 6.97207357e-01 2.94003824e-01]
 [9.73938144e-01 2.60617338e-02 1.22613841e-07]
 [1.78434058e-03 4.79518176e-01 5.18697483e-01]
 [5.56924348e-04 2.46776840e-01 7.52666235e-01]
 [9.83549842e-01 1.64500663e-02 9.13617287e-08]
 [1.65201474e-02 9.54672748e-01 2.88071044e-02]
 [8.99853738e-03 7.82707574e-01 2.08293888e-01]
 [2.98015034e-05 5.45900073e-02 9.45380191e-01]
 [9.35695862e-01 6.43039532e-02 1.85301378e-07]
 [9.80621190e-01 1.93787396e-02 7.00125287e-08]
 [1.68478819e-04 3.30167228e-01 6.69664293e-01]
 [3.54046174e-03 4.02267803e-01 5.94191735e-01]
 [9.70617285e-01 2.93824730e-02 2.42443976e-07]
 [2.56895213e-04 1.54631584e-01 8.45111521e-01]
 [3.48668498e-02 9.11966139e-01 5.31670115e-02]
 [1.47218853e-02 6.84038112e-01 3.01240003e-01]
 [9.46510474e-04 4.28641988e-01 5.70411502e-01]
 [9.64848138e-01 3.51516745e-02 1.87917892e-07]
 [9.70436780e-01 2.95624016e-02 8.18591638e-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()

output:

在这里插入图片描述

这次的准确率并不是1了,其中在标签1和标签2的样本判断上出现了错误。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Executing tasks: [:app:assembleDebug] in project D:\Users\lenovo\AndroidStudioProjects\Pinduoduo WARNING: The specified Android SDK Build Tools version (27.0.0) is ignored, as it is below the minimum supported version (28.0.3) for Android Gradle Plugin 3.5.2. Android SDK Build Tools 28.0.3 will be used. To suppress this warning, remove "buildToolsVersion '27.0.0'" from your build.gradle file, as each version of the Android Gradle Plugin now has a default version of the build tools. > Task :app:preBuild UP-TO-DATE > Task :app:preDebugBuild UP-TO-DATE > Task :app:checkDebugManifest UP-TO-DATE > Task :app:generateDebugBuildConfig UP-TO-DATE > Task :app:javaPreCompileDebug UP-TO-DATE > Task :app:mainApkListPersistenceDebug UP-TO-DATE > Task :app:generateDebugResValues UP-TO-DATE > Task :app:createDebugCompatibleScreenManifests UP-TO-DATE > Task :app:mergeDebugShaders UP-TO-DATE > Task :app:compileDebugShaders UP-TO-DATE > Task :app:generateDebugAssets UP-TO-DATE > Task :app:compileDebugRenderscript NO-SOURCE > Task :app:compileDebugAidl NO-SOURCE > Task :app:generateDebugResources UP-TO-DATE > Task :app:mergeDebugResources UP-TO-DATE > Task :app:processDebugManifest > Task :app:processDebugResources FAILED AGPBI: {"kind":"error","text":"Android resource linking failed","sources":[{"file":"D:\\Users\\lenovo\\AndroidStudioProjects\\Pinduoduo\\app\\src\\main\\res\\layout\\activity_main.xml","position":{"startLine":34}}],"original":"D:\\Users\\lenovo\\AndroidStudioProjects\\Pinduoduo\\app\\src\\main\\res\\layout\\activity_main.xml:35: AAPT: error: '#875ale' is incompatible with attribute textColor (attr) reference|color.\n ","tool":"AAPT"} FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':app:processDebugResources'. > A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade > Android resource linking failed D:\Users\lenovo\AndroidStudioProjects\Pinduoduo\app\src\main\res\layout\activity_main.xml:35: AAPT: error: '#875ale' is incompatible with attribute textColor (attr) reference|color. * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights. * Get more help at https://help.gradle.org BUILD FAILED in 3s 11 actionable tasks: 2 executed, 9 up-to-date
06-07
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值