使用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
相关产品推荐
相关产品推荐

