鸢尾花案例之模型评估和预测
1 课程概览
本课完整实现KNN算法对鸢尾花的分类案例,包括数据加载、数据划分、特征标准化、模型训练、模型预测和模型评估。重点讲解fit_transform与transform的区别、自定义数据集预测、预测概率查看,以及两种模型评估方式。
2 核心概念与定义
- fit_transform:训练+转换,适用于第一次标准化(训练集),会计算并保存参数。
- transform:仅转换,适用于后续标准化(测试集),使用已保存的参数。
- predict:模型预测方法,传入特征,返回预测标签。
- predict_proba:预测概率方法,返回各分类的概率。
- score:模型评估方法,直接计算准确率。
- accuracy_score:sklearn.metrics模块的准确率计算函数。
3 算法与模型详解
3.1 完整案例流程
- 加载数据集:load_iris()
- 数据预处理:train_test_split划分训练集和测试集(8:2)
- 特征工程:
- 特征提取:无需(4个特征都使用)
- 特征预处理:标准化(StandardScaler)
- 模型训练:创建KNeighborsClassifier对象,fit训练
- 模型预测:predict预测测试集和新数据集
- 模型评估:score或accuracy_score计算准确率
3.2 标准化的fit_transform与transform
| 方法 | 功能 | 适用场景 |
|---|---|---|
| fit_transform | 训练+转换(先计算参数再转换) | 第一次标准化(训练集) |
| transform | 仅转换(使用已保存参数) | 后续标准化(测试集、新数据) |
为什么测试集只用transform:
- fit_transform会重新计算参数(均值、标准差)
- 测试集必须使用训练集的参数进行转换,保证一致性
- 如果测试集用fit_transform,参数不同,标准化结果不一致
3.3 模型预测的两种场景
| 场景 | 说明 | 数据来源 |
|---|---|---|
| 场景1 | 对切分的测试集预测 | x_test(30条) |
| 场景2 | 对新数据集预测 | 自定义数据(150条之外) |
3.4 自定义数据集预测要点
- 特征值必须在数据集参考范围内
- 新数据集也必须进行标准化(使用transform)
- 可通过predict_proba查看各分类的预测概率
3.5 模型评估的两种方式
| 方式 | 方法 | 说明 |
|---|---|---|
| 方式1 | estimator.score(x_train, y_train) | 直接评分(基于训练集) |
| 方式2 | accuracy_score(y_test, y_predict) | 调用函数(基于测试集) |
两种方式结果一致,方式2更专业(对比测试集真实标签和预测结果)。
4 数学原理与推导
本课重点为代码实现,数学原理参见KNN算法简介。
5 代码示例
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
def dm04_iris_evaluate_test():
# 1. 加载数据集
iris_data = load_iris()
# 2. 数据预处理:按8:2切分训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(
iris_data.data, iris_data.target,
test_size=0.2, random_state=23
)
# 3. 特征工程:标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train) # 训练集:fit_transform
x_test = transfer.transform(x_test) # 测试集:transform
# 4. 模型训练
estimator = KNeighborsClassifier(n_neighbors=3)
estimator.fit(x_train, y_train)
# 5. 模型预测
# 场景1:对切分的测试集预测
y_predict = estimator.predict(x_test)
print("预测结果:", y_predict)
# 场景2:对新数据集预测
my_data = [[5.1, 3.5, 1.4, 0.2]]
my_data = transfer.transform(my_data) # 新数据也要标准化
y_predict_new = estimator.predict(my_data)
print("新数据预测值:", y_predict_new)
# 查看各分类的预测概率
y_predict_proba = estimator.predict_proba(my_data)
print("各分类预测概率:", y_predict_proba)
# 6. 模型评估
# 方式1:直接评分
print("准确率(方式1):", estimator.score(x_train, y_train))
# 方式2:调用accuracy_score
print("准确率(方式2):", accuracy_score(y_test, y_predict))
if __name__ == '__main__':
dm04_iris_evaluate_test()
输出示例:
预测结果: [0 1 1 ... 2 0 2]
新数据预测值: [0]
各分类预测概率: [[1. 0. 0.]]
准确率(方式1): 0.9583333333333334
准确率(方式2): 0.9666666666666667
6 重难点与易错提醒
- ❗重点:训练集用fit_transform(第一次标准化),测试集用transform(使用训练集参数)。
- ❗重点:新数据集也必须进行标准化(使用transform,不能用fit_transform)。
- ❗重点:predict_proba返回各分类的概率,概率最大的分类作为预测结果。
- ⚠️易错:测试集不能用fit_transform,否则参数不一致,标准化结果错误。
- ⚠️易错:自定义测试数据的特征值必须在数据集参考范围内。
- ⚠️易错:accuracy_score传入的是真实标签(y_test)和预测结果(y_predict),不是特征。
- 💡深入理解:两种评估方式结果一致,方式2(accuracy_score)更专业。
7 课堂问答精选
Q: 为什么测试集只用transform而不用fit_transform?
A: fit_transform会重新计算参数(均值、标准差),如果测试集用fit_transform,参数与训练集不同,标准化结果不一致。测试集必须使用训练集的参数进行转换,保证数据一致性,所以只用transform。
Q: 两种模型评估方式有什么区别?
A:
- 方式1:estimator.score(x_train, y_train),直接基于训练集评分。
- 方式2:accuracy_score(y_test, y_predict),对比测试集真实标签和预测结果。 两种方式结果一致,方式2更专业,因为它基于测试集评估模型的泛化能力。
Q: predict和predict_proba有什么区别?
A: predict返回预测的类别标签(如0、1、2),predict_proba返回各分类的概率(如[[0.0, 0.8, 0.2]])。概率最大的分类作为predict的预测结果。
8 本课小结
- 完整案例流程:加载→划分→标准化→训练→预测→评估。
- 标准化:训练集用fit_transform,测试集用transform。
- 预测:predict返回类别,predict_proba返回概率。
- 评估:score直接评分,accuracy_score对比真实标签和预测结果。
- 新数据集也必须标准化(使用transform)。
9 延伸思考与实践
- 实践:修改n_neighbors值,观察准确率变化。
- 思考:为什么测试集不能用fit_transform?
- 预习:交叉验证和网格搜索寻找最优超参数。