You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用KNN测试归一化器时触发TypeError错误求助

解决TypeError:归一化器实例无法直接用于train_test_split的问题

你遇到的这个错误核心原因很明确:你把归一化器的拟合实例直接传给了train_test_split,但这个函数需要的是特征数据集,不是预处理工具本身。

让我们一步步拆解问题并修正代码:

1. 理解预处理的正确流程

preprocessing.Normalizer().fit(X)只是让归一化器学习了X的特征规则,并没有生成处理后的特征数据。你需要调用transform()方法来得到真正可用的归一化特征矩阵:

from sklearn import preprocessing

# 第一步:拟合归一化器(学习数据的归一化规则)
scaler = preprocessing.Normalizer().fit(X)
# 第二步:用规则转换原始数据,得到归一化后的特征矩阵
X_scaled = scaler.transform(X)

或者用更简洁的fit_transform()一步完成拟合+转换:

X_scaled = preprocessing.Normalizer().fit_transform(X)

2. 修正数据集拆分的问题

你原本的代码把归一化器实例T传给了train_test_split,这完全不对——应该传处理后的特征矩阵X_scaled。另外注意:sklearn 0.20版本之后,cross_validation模块已经被弃用,要改用model_selection:

from sklearn.model_selection import train_test_split

# 正确拆分:传入处理后的特征和标签
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.3, random_state=7)

3. 回归你的初衷:测试KNN模型

看你的描述是想测试KNN,但代码里用了SVC(支持向量机),记得把模型替换成KNN:

from sklearn.neighbors import KNeighborsClassifier

# 初始化KNN模型(可以调整n_neighbors等参数)
model = KNeighborsClassifier()
model.fit(X_train, y_train)
score = model.score(X_test, y_test)
print(f"测试得分: {score}")

4. 批量测试不同归一化器的完整代码

既然你想对比Normalizer、MinMaxScaler、StandardScaler的效果,这里给你写一个批量测试的脚本,逻辑更清晰:

import pandas as pd
from sklearn import preprocessing
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier

# 加载数据
X = pd.read_csv('C:/Users/rmahesh/documents/parkinson.csv')
# 假设你的标签变量是y,这里需要确保y已经正确提取(比如从X中分离)
# 示例:如果标签列名为'label',可以这样提取:
# y = X.pop('label')

# 定义要测试的归一化器列表
scaler_list = [
    ("L2归一化器", preprocessing.Normalizer()),
    ("最小最大缩放器", preprocessing.MinMaxScaler()),
    ("标准标准化器", preprocessing.StandardScaler())
]

# 遍历测试每个归一化器
for scaler_name, scaler in scaler_list:
    # 拟合并转换特征数据
    X_processed = scaler.fit_transform(X)
    # 拆分训练集和测试集
    X_train, X_test, y_train, y_test = train_test_split(X_processed, y, test_size=0.3, random_state=7)
    # 训练KNN模型
    knn_model = KNeighborsClassifier()
    knn_model.fit(X_train, y_train)
    # 计算测试得分
    test_score = knn_model.score(X_test, y_test)
    print(f"{scaler_name} 对应的KNN测试得分: {test_score:.4f}")

额外注意点

  • Normalizer和另外两个缩放器的区别:Normalizer是对单个样本做归一化(比如把每个样本的L2范数缩为1),而MinMaxScaler/StandardScaler是对整个特征列做缩放/标准化,适用场景不同。
  • 如果你的数据集包含分类特征,可能还需要先做编码处理,但从你的问题看应该都是数值特征,暂时不用考虑。

内容的提问来源于stack exchange,提问作者rmahesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:40:42