1、例子:鸢尾花分类案例(KNN分类)
2、方法:网上找视频先看一遍,然后手敲代码复现成功后,再逐行把代码扔给文心一眼翻译意思。这样似懂非懂的学不知道方法行不行。##########################################################################################################################################################
# 0、导入相应的包
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
# 1、函数调用
iris = load_iris()
# 2、数据预处理
# 这四个参数经常混淆
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=0.2,random_state=2)
# 3、特征工程
# 不实例化StandardScaler(),直接在13,14行把transfer换成StandardScaler()是否可以?
# 为什么一个用fit_transform,另外一个用transform?
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 4、机器学习-KNN
# 同样问题,输入x_train,y_train易混淆
estimator = KNeighborsClassifier(n_neighbors = 5)
estimator.fit(x_train,y_train)
# 5、模型准确性
# 5.1 预测值结果输出
y_pre = estimator.predict(x_test)
print("预测值为:\n",y_pre)
# 5.2 准确率评估
score = estimator.score(x_test,y_test)
print("模型准确率为:\n",score)
A、x_train,x_test,y_train,y_test这四个参数书写的时候经常写混。
B、不实例化StandardScaler(),直接把transfer换成StandardScaler()是否可以?
答:亲测不行,只能硬性理解为书写格式就是这么要求的,讲道理都transfer = StandardScaler()这俩都划等号了,以为替换是可以的。
C、为什么一个用fit_transform,另外一个用transform?
答:这个不太理解,查了下也没太看明白。
#############################################################################关键代码:
1、train_test_split():输入X和Y的完整数据集,test_size分配训练集和测试集的比例。返回四个值,x_train,x_test,y_train,y_test
2、StandardScaler():数据标准化,将杂乱无章的数据标准化到固定均值和方差的分布上(万一这数据就不符合正态分布呢?还要用这个方法进行特征处理吗?)
3、fit_transform()和transform():
- StandardScaler的作用
- 这是一个标准化处理器,通过以下公式转换数据:
z = (x - μ) / σ
其中:- μ是特征列的均值
- σ是特征列的标准差
- 目的:使每个特征的均值为0,标准差为1,消除不同特征的量纲差异
- fit_transform与transform的区别
- fit_transform():
- 先计算训练集的均值和标准差(fit过程)
- 用这些统计量对训练集进行标准化(transform过程)
- 相当于同时执行fit和transform两个操作
- transform():
- 直接使用之前计算好的均值和标准差(来自训练集)
- 对测试集进行相同的标准化转换
- 不重新计算统计量,避免数据泄露
- 为什么测试集不能用fit_transform?
- 核心原则:测试集应该完全模拟未知数据
- 如果使用fit_transform:
- 会用测试集自身的统计量进行标准化
- 相当于模型在评估时"看见"了测试集的信息
- 导致评估结果虚高,失去泛化能力评估的意义
- 正确做法:
- 训练集:fit_transform(计算参数+转换)
- 测试集:transform(使用训练集的参数转换)
类比理解:
想象考试出题场景:
- 训练集 = 历年真题(通过fit_transform分析题型规律)
- 测试集 = 今年考题(用transform按已分析的规律处理)
如果测试集也用fit_transform,相当于考试前先看了今年考题再出题,完全失去考核意义。
可视化验证(假设原始数据分布):
- 原始数据:可能呈现不同均值和方差的分布
- 标准化后:所有特征将呈现标准正态分布(钟形曲线)
4、 KNeighborsClassifier():KNN算法分类器,通过计算欧氏距离来做分类,K值的选择太小则模型复杂容易过拟合,取太大则模型简单容易欠拟合(忽略局部特征),通过交叉验证来选择合适的K值(咋交叉??上哪交?)
StandardScaler
对 KNN 至关重要,因为:
- KNN 基于距离计算,不同特征的量纲差异会严重扭曲距离度量
- 例如:特征A取值范围[0,1],特征B取值范围[1000,2000],计算距离时特征B会完全主导结果
- 标准化后所有特征具有相同尺度(均值为0,标准差为1),确保距离计算公平
5、.fit():学习特征
#############################################################################