首先导入我们所需要用到的库
import numpy as np
import pandas as pd
## 绘图函数库
import matplotlib.pyplot as plt
import seaborn as sns
要训练模型,首先要处理数据集,我们使用的数据集是sklearn中的鸢尾花数据集,该数据集一共有四个特征变量,一个目标分类变量,共有150个样本。
变量 | 描述 |
---|---|
sepal length | 花萼长度(cm) |
sepal width | 花萼宽度(cm) |
petal length | 花瓣长度(cm) |
petal width | 花瓣宽度(cm) |
target | 鸢尾的三个亚属类别,‘setosa’(0), ‘versicolor’(1), ‘virginica’(2) |
#从sklearn中导入鸢尾花数据集
from sklearn.datasets import load_iris
data = load_iris()
iris_label = data.target
iris_features = pd.DataFrame(data=data.data, columns=data.feature_names)
#查看数据大致情况
iris_features.info()
当我们拿到数据集后首先要看这个数据集的大致情况,都有什么特征,以及有没有缺失值,如果有缺失值就要对缺失值进行处理。从上面我们可以看到,这个数据集并没有缺失值,因此不需要进行缺失值处理。
查看数据集的前五行
iris_features.head()
## 其对应的类别标签为,其中0,1,2分别代表'setosa', 'versicolor', 'virginica'三种不同花的类别。
iris_label
在训练数据之前,我们先在图中查看一下该数据集
在这里为了避免我们在可视化的过程中不小心修改到原数据,这里我们对原数据进行一下拷贝
iris_demo = iris_features.copy()
iris_demo['target'] = iris_label
#查看一下用于可视化的数据集
iris_demo.head()
## 特征与标签组合的散点可视化
sns.pairplot(data=iris_demo, 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_demo)
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_demo_label1 = iris_demo[iris_demo['target']==0].values
iris_demo_label2 = iris_demo[iris_demo['target']==1].values
iris_demo_label3 = iris_demo[iris_demo['target']==2].values
ax.scatter(iris_demo_label1[:,0], iris_demo_label1[:,1], iris_demo_label1[:,2],label='setosa')
ax.scatter(iris_demo_label2[:,0], iris_demo_label2[:,1], iris_demo_label2[:,2],label='versicolor')
ax.scatter(iris_demo_label3[:,0], iris_demo_label3[:,1], iris_demo_label3[:,2],label='virginica')
plt.legend()
plt.show()
from sklearn.model_selection import train_test_split
#选择类别为0和1的样本
iris_features_part = iris_features.iloc[:100]
iris_label_part = pd.Series(iris_label).iloc[:100].values
#划分训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(iris_features_part,iris_label_part,test_size = 0.2,
random_state=2020)
这里我们做的是二分类,因此我们在样本数据集中选择两种鸢尾花的数据进行训练
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)
print(train_predict,y_train)
test_predict = clf.predict(x_test)
print(test_predict,y_test)
从上面的结果我们可以看到,无论是在训练集还是测试集,我们的预测值和实际值是一样的。接下来我们用利用accuracy(准确度)评估模型效果
精确度指的是 预测正确的样本数目占总预测样本数目的比例
accuracy也有缺点,就是在样本不平衡的情况下并不能作为很好的指标来衡量结果
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))
这里accuracy的值是1,我们在上面测试的结果是一致的。
## 查看混淆矩阵 (预测值和真实值的各类情况统计矩阵)
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()