纯小白的Sklearn学习(K近邻-鸢尾花分类)-day(1)

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():

  1. StandardScaler的作用
  • 这是一个标准化处理器,通过以下公式转换数据:
    z = (x - μ) / σ
    其中:
    • μ是特征列的均值
    • σ是特征列的标准差
  • 目的:使每个特征的均值为0,标准差为1,消除不同特征的量纲差异
  1. fit_transform与transform的区别
  • fit_transform():
    • 先计算训练集的均值和标准差(fit过程)
    • 用这些统计量对训练集进行标准化(transform过程)
    • 相当于同时执行fit和transform两个操作
  • transform():
    • 直接使用之前计算好的均值和标准差(来自训练集)
    • 对测试集进行相同的标准化转换
    • 不重新计算统计量,避免数据泄露
  1. 为什么测试集不能用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():学习特征

#############################################################################

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值