Logistic Regression代码中cross_val_predict触发TypeError错误的解决方法
问题解决方法
错误原因
你调用cross_val_predict时,传入的第一个参数是从statistics模块导入的mode函数——这是个普通统计函数,不是scikit-learn的模型估计器,而cross_val_predict要求第一个参数必须是实现了get_params方法的scikit-learn模型对象,因此触发类型错误。
修复后的代码
把cross_val_predict里的mode替换成你已经实例化好的Logistic回归模型model即可,同时补充交叉验证结果的准确率计算,让逻辑更完整:
from statistics import mode # 若后续不用该函数可直接删除 import pandas as pd from sklearn.model_selection import KFold from sklearn.metrics import plot_confusion_matrix, accuracy_score from sklearn.model_selection import cross_val_score from sklearn.model_selection import cross_val_predict from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split # 导入数据集 datasets = pd.read_csv('C:/Users/n3.csv', header=None) X = datasets.iloc[:, 0:5].values Y = datasets.iloc[:, 5].values # 划分训练集和测试集 X_Train, X_Test, Y_Train, Y_Test = train_test_split(X, Y, test_size=0.25, random_state=0) # 实例化模型(数据集维度较大时,建议增加max_iter参数避免模型不收敛) model = LogisticRegression(max_iter=1000) # 交叉验证预测:将mode替换为实例化好的model predicted = cross_val_predict(model, X_Train, Y_Train, cv=5) # 计算训练集准确率与交叉验证预测准确率 train_acc = model.fit(X_Train, Y_Train).score(X_Train, Y_Train) cv_acc = accuracy_score(Y_Train, predicted) print(f"训练集准确率: {train_acc*100:.2f}%") print(f"交叉验证预测准确率: {cv_acc*100:.2f}%")
额外说明
- 若不需要
statistics模块的mode函数,可直接删除对应的导入语句,避免命名混淆。 - 当数据集特征较多或分布复杂时,LogisticRegression默认的迭代次数(max_iter=100)可能不足以让模型收敛,手动设置
max_iter=1000能有效避免这类问题。 cross_val_predict返回交叉验证过程中每个样本的预测值,搭配accuracy_score计算的准确率,比仅看训练集准确率更能反映模型的泛化能力。
内容的提问来源于stack exchange,提问作者lena
相关产品推荐
相关产品推荐

