目录
- 1. 鸢尾花分类
- 1.1 初识数据
- 1.2 衡量模型是否成功:训练数据与测试数据
- 1.3 要事第一:观察数据
- 1.4 构建第一个模型:k近邻算法(KNeighborsClassifier)
- 1.5 做出预测(predict)
- 1.6 评估模型
1. 鸢尾花分类
- 在多个选项中预测其中一个(鸢尾花的品种):分类问题
- 可能的输出(鸢尾花的不同品种):类别
- 单个数据点(一朵鸢尾花)的预期输出:这朵花的品种
- 对于一个数据点来说,它的品种:标签
1.1 初识数据
- 使用鸢尾花(Iris)数据集
from sklearn.datasets import load_irisdataset = load_iris()print(dataset.keys())
# dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename', 'data_module'])
# data: 测量数据(150*4)
# target: 每朵花的品种(150)
# target_names: 花的品种(3)
# feature_names: 对特征进行说明(4)
1.2 衡量模型是否成功:训练数据与测试数据
-
不能将用于构建模型的数据用于评估模型
- 无法告诉我们模型的泛化能力如何(在新数据上能否正确预测)
-
将收集好的数据分成两个部分
- 一部分用于构建机器学习模型:训练数据或训练集
- 另一部分用于评估模型性能:测试数据、测试集或留出集
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_splitdataset = load_iris()
X_train, X_test, y_train, y_test = train_test_split(dataset["data"], dataset["target"], random_state=0)
# X: 数据
# y: 标签
# random_state: 随机数生成器的种子
# 训练数据占比75%
# 测试数据占比25%
1.3 要事第一:观察数据
- 观察数据的方法:可视化
- 绘制散点图
- 一个特征作为 x x x轴
- 一个特征作为 y y y轴
- 缺点:只能绘制两个或三个特征,难以对多于三个特征的数据集作图
- 绘制散点图矩阵
- 两两查看所有的特征
- 缺点:无法同时显示所有特征之间的关系
- 绘制散点图
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import pandas as pd
import matplotlib.pyplot as pltdataset = load_iris()
X_train, X_test, y_train, y_test = train_test_split(dataset["data"], dataset["target"], random_state=0)
dataframe = pd.DataFrame(X_train, columns=dataset["feature_names"])
pd.plotting.scatter_matrix(frame=dataframe, c=y_train, figsize=(15, 15), marker="o", hist_kwds={"bins": 20}, s=60, alpha=0.8, cmap=plt.cm.get_cmap('Pastel1'))
# c: 颜色
# figsize: 图的尺寸
# marker: 点的样式
# hist_kwds: 柱状图的样式
# s: 点的半径
# alpha: 透明度
# cmap: 配色风格
plt.show()
1.4 构建第一个模型:k近邻算法(KNeighborsClassifier)
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifierdataset = load_iris()
X_train, X_test, y_train, y_test = train_test_split(dataset["data"], dataset["target"], random_state=0)
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(X_train, y_train)
1.5 做出预测(predict)
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
import numpy as npdataset = load_iris()
X_train, X_test, y_train, y_test = train_test_split(dataset["data"], dataset["target"], random_state=0)
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(X_train, y_train)
X_new = np.array([[5, 2.9, 1, 0.2]])
# 与训练集格式对应
prediction = knn.predict(X_new)
print(f"{prediction}: {dataset['target_names'][prediction]}")
# [0]: ['setosa']
1.6 评估模型
- 计算精度来衡量模型的优劣
- 精度:品种预测正确的所占比例
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
import numpy as npdataset = load_iris()
X_train, X_test, y_train, y_test = train_test_split(dataset["data"], dataset["target"], random_state=0)
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
print(f"score(np.mean) : {np.mean(y_test == y_pred)}")
# score(np.mean) : 0.9736842105263158
# 参数: 布尔表达式(测试标记与预测标记是否相等)
print(f"score(knn.score) : {knn.score(X_test, y_test)}")
# score(knn.score) : 0.9736842105263158
# 参数: 测试数据,测试标记