一、前言
1.1 数据集iris探索性分析
Iris数据集是常用的分类实验数据集,由Fisher, 1936收集整理。Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。数据集包含150个数据样本,分为3类,每类50个数据,每个数据包含4个属性。可通过花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性预测鸢尾花卉属于(Setosa,Versicolour,Virginica)三个种类中的哪一类。
该数据集包含了4个属性:
序号 | 属性 | 单位 |
1 | Sepal.Length(花萼长度) | cm |
2 | Sepal.Width(花萼宽度) | cm |
3 | Petal.Length(花瓣长度) | cm |
4 | Petal.Width(花瓣宽度) | cm |
种类:Iris Setosa(山鸢尾)、Iris Versicolour(杂色鸢尾),以及Iris Virginica(维吉尼亚鸢尾)。
1.2 导入工具包
1.2.1 导入数据
导入数据的方法如下:from sklearn.datasets import 数据名称Scikit-learn 支持以 NumPy 的 arrays 对象、 Pandas 对象、 SciPy 的稀疏矩阵及其他可转换为数值型 arrays 的数据结构作为其输入,前提是数据必须是数值型的。 sklearn.datasets 模块提供了一系列加载和获取著名数据集如鸢尾花、波士顿房价、 Olivetti 人脸、 MNIST 数据集等的工具,也包括了一些toy data 如 S 型数据等的生成工具。 Scikit-learn内置了很多可以用于机器学习的数据,可以用两行代码就可以使用这些数据。内置数据分为可以直接 使用的数据集、需下载的数据集以及生成数据集。
1.2.2 导入工具及加载数据
# 导入iris数据集
from sklearn.datasets import load_iris
# 分割数据模块
from sklearn.model_selection import train_test_split
# K最近(KNN,K-Nearest Neighbor)分类算法
from sklearn.neighbors import KNeighborsClassifier
# 加载iris数据集
data = load_iris()
# 导入数据和标签
data_X = data.data
data_y = data.target
1.3 利用matplotlib将数据可视化
1.3.1 代码
# ———————画图,看第一和第三特征的分布——————————————————
import matplotlib.pyplot as plt
print(data.feature_names)
# print(data.data[:, 0])
# print(data.data[:, 2])
feature_1 = data.data[:, 0]
feature_3 = data.data[:, 2]
plt.scatter(feature_1, feature_3) # 看数据分布
plt.show()
# _--------------------150个数据的行索引号0-149------------
plt.scatter(feature_1[:50], feature_3[:50], c='red') # 第一类
plt.scatter(feature_1[50:100], feature_3[50:100], c='blueviolet') # 第二类
plt.scatter(feature_1[100:], feature_3[100:], c='darkred') # 第三类
plt.show()
1.3.2 图
注:红色--第一类;紫色--第二类;深红色--第三类
二、数据预处理
2.1 划分数据集的工具
2.1.1 导入划分数据集工具train_test_split
from sklearn.model_selection import train_test_split
2.2.2 train_test_split函数的定义
def train_test_split(*arrays,test_size=None,train_size=None,random_state=None,
shuffle=True,stratify=None,):
参数:
1. arrays:一个或多个数据集。
2. test_size:测试集的大小,可以表示为绝对个数或相对比例。
3. train_size:训练集的大小,可以表示为绝对个数或相对比例。
4. random_state:随机数种子,用于确保获得可重复的结果。
5. shuffle:表示是否将数据集打乱后再划分。
6. stratify:表示是否按照某个因素进行分层抽样。
其中,test_size和train_size的相对比例需要满足以下条件之一:
1. test_size和train_size都为None,此时默认划分比例为0.25。
2. test_size和train_size都指定了绝对个数。
3. test_size指定了相对比例,train_size为None,此时训练集大小为1-test_size。
4. train_size指定了相对比例,test_size为None,此时测试集大小为1-train_size。
stratify参数是用于处理数据集中不平衡的情况,比如分类问题中各类别之间数据量差别较大,为了在测试集和训练集中保持类别分布的一致性,可以使用stratify参数。如果划分数据集的目标变量是y,可以将stratify=y。
2.2 对iris数据集进行划分
# 将完整数据集的70%作为训练集,30%作为测试集,
# 并使得测试集和训练集中各类别数据的比例与原始数据集比例一致(stratify分层策略),另外可通过设置shuffle=True 提前打乱数据。
X_train, X_test, y_train, y_test = train_test_split(data_X,
data_y,
random_state=12,
stratify=data_y,
test_size=0.3)
三、建模分析
3.1 K近邻模型函数相关定义及参数
3.1.1 定义
KNeighborsClassifier(n_neighbors=5, weights='uniform',
algorithm='auto', leaf_size=30,
p=2, metric='minkowski',
metric_params=None, n_jobs=1, **kwargs)
3.1.2 参数
- n_neighbors: 默认值为5,表示查询k个最近邻的数目
- algorithm: {‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’},指定用于计算最近邻的算法,auto表示试图采用最适合的算法计算最近邻
- leaf_size: 传递给‘ball_tree’或‘kd_tree’的叶子大小
- metric: 用于树的距离度量。默认'minkowski与P = 2(即欧氏度量)
- n_jobs: 并行工作的数量,如果设为-1,则作业的数量被设置为CPU内核的数量
3.2 建立模型并进行训练预测
# 建立模型
knn = KNeighborsClassifier()
# knn=KNeighborsClassifier(n_neighbors=3)
# 训练模型
knn.fit(X_train, y_train)
print(knn.score(X_test, y_test)) # 计算模型的准确率
# 预测模型
y_pred = knn.predict(X_test)
print(y_pred - y_test)
3.2.1 模型预测结果
正确率:0.97777777……
四、模型评估
4.1 用accuracy_score计算准确率
# ——用accuracy_score计算准确率— ———————
from sklearn.metrics import accuracy_score
print(accuracy_score(y_test, y_pred)) # 也可以算正确率
print(accuracy_score(y_test, y_pred, normalize=False)) # 统计测试样本分类的个数
正确率:0.977777777……
五、加载和保存模型
# 保存和加载模型
import joblib
# 用joblib.dump保存模型
joblib.dump(knn, 'iris_KNN.pkl')
# # 用joblib.load加载已保存的模型
knn1 = joblib.load('iris_KNN.pkl')
# #测试读取后的Model
print(knn1.predict(data_X[0:1])) # 预测第一个数据的类别
y_pred1 = knn1.predict(X_test)
print(y_pred1 - y_test)
六、完整代码
# (1)数据导入,分割数据
# 导入iris数据集
from sklearn.datasets import load_iris
# 分割数据模块
from sklearn.model_selection import train_test_split
# (2)K最近(KNN,K-Nearest Neighbor)分类算法
from sklearn.neighbors import KNeighborsClassifier
# 加载iris数据集
data = load_iris()
# 导入数据和标签
data_X = data.data
data_y = data.target
# ———————画图,看第一和第三特征的分布——————————————————
import matplotlib.pyplot as plt
print(data.feature_names)
# print(data.data[:, 0])
# print(data.data[:, 2])
feature_1 = data.data[:, 0]
feature_3 = data.data[:, 2]
plt.scatter(feature_1, feature_3) # 看数据分布
plt.show()
# _--------------------150个数据的行索引号0-149------------
plt.scatter(feature_1[:50], feature_3[:50], c='red') # 第一类
plt.scatter(feature_1[50:100], feature_3[50:100], c='blueviolet') # 第二类
plt.scatter(feature_1[100:], feature_3[100:], c='darkred') # 第三类
plt.show()
# 分割数据
# 将完整数据集的70%作为训练集,30%作为测试集,
# 并使得测试集和训练集中各类别数据的比例与原始数据集比例一致(stratify分层策略),另外可通过设置shuffle=True 提前打乱数据。
X_train, X_test, y_train, y_test = train_test_split(data_X,
data_y,
random_state=12,
stratify=data_y,
test_size=0.3)
# 建立模型进行训练和预测
# 建立模型
knn = KNeighborsClassifier()
# knn=KNeighborsClassifier(n_neighbors=3)
# (3)训练模型
knn.fit(X_train, y_train)
print(knn.score(X_test, y_test)) # 计算模型的准确率
# (4)预测模型
y_pred = knn.predict(X_test)
print(y_pred - y_test)
# (5)评价— ——用accuracy_score计算准确率— ———————
from sklearn.metrics import accuracy_score
print(accuracy_score(y_test, y_pred)) # 也可以算正确率
print(accuracy_score(y_test, y_pred, normalize=False)) # 统计测试样本分类的个数
# (6)保存和加载模型
import joblib
# 用joblib.dump保存模型
joblib.dump(knn, 'iris_KNN.pkl')
# # 用joblib.load加载已保存的模型
knn1 = joblib.load('iris_KNN.pkl')
# #测试读取后的Model
print(knn1.predict(data_X[0:1])) # 预测第一个数据的类别
y_pred1 = knn1.predict(X_test)
print(y_pred1 - y_test)
标签:iris,数据,feature,train,test,鸢尾花,size,data,Sklearn
From: https://blog.csdn.net/m0_59611146/article/details/136792251