sklearn调用RandomForestClassifier提示未拟合报错问题求助
报错排查与修复方案
你遇到的This RandomForestClassifier instance is not fitted yet报错核心原因是代码没有正确执行随机森林模型的拟合(训练)步骤,同时代码里还有几处会阻断运行的逻辑错误,按以下顺序修复即可:
- 修复特征与标签赋值错误
你当前把整个数据集同时赋值给X和Y,还存在变量大小写不匹配问题:代码拆分数据集用的是小写y,你定义的是大写Y。需要明确拆分特征和标签:把你要预测的目标列单独拿出来作为y,剩下的列作为特征X,示例:# 把target_col替换成你数据集里实际的目标列名,比如"is_churn"、"label" target_col = "你的预测目标列名" X = dataset_df.drop(target_col, axis=1) y = dataset_df[target_col] # 如果标签是文本类型,用LabelEncoder转成数值型 le = LabelEncoder() y = le.fit_transform(y) - 修复被误注释的数据集拆分代码
你第一次拆分训练集、测试集的代码被单引号包裹,变成了普通字符串完全没执行,后续拆分验证集用到的X_train、y_train根本没有定义。去掉包裹代码的单引号,正常执行拆分逻辑:# 删掉原来包裹这行代码的单引号 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state=1) X_train, X_validation, y_train, y_validation = train_test_split(X_train, y_train, test_size = 0.3, random_state=1) - 修复模型训练逻辑(报错直接原因)
你在实例化随机森林之后,单独写了一个无意义的fit关键字,既没有指定要拟合的模型,也没有传入训练数据,相当于根本没执行训练步骤。另外你重复导入了一次RandomForestClassifier,属于冗余代码直接删掉即可。
注意:sklearn所有的预估器(分类、回归模型都算),都必须显式调用.fit(训练特征, 训练标签)方法完成训练后,才能调用predict、predict_proba等预测接口。
额外提示:随机森林是基于树的模型,对特征尺度不敏感,不需要做StandardScaler标准化;逻辑回归是线性模型,必须输入标准化后的特征训练效果才稳定。 - 修正预测阶段的特征输入
训练逻辑回归用的是标准化后的特征,预测时也要输入标准化后的验证集/测试集;随机森林用原始特征训练,预测时直接输入原始特征即可,不需要过标准化。
修复后可运行完整代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt # 把重复导入的库合并到开头 from sklearn.linear_model import LogisticRegression from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler, LabelEncoder from sklearn.metrics import accuracy_score, roc_curve, roc_auc_score # 这行是jupyter专属魔法命令,跑普通.py脚本就删掉 %matplotlib inline # 1. 拆分特征、标签 target_col = "替换成你自己的目标列名" X = dataset_df.drop(target_col, axis=1) y = dataset_df[target_col] y = LabelEncoder().fit_transform(y) # 2. 拆分数据集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state=1) X_train, X_validation, y_train, y_validation = train_test_split(X_train, y_train, test_size = 0.3, random_state=1) # 3. 特征标准化(仅给逻辑回归用) sc = StandardScaler() sc.fit(X_train) X_train_std = sc.transform(X_train) X_val_std = sc.transform(X_validation) X_test_std = sc.transform(X_test) # 4. 训练模型 lr = LogisticRegression(C=1000, random_state=1) lr.fit(X_train_std, y_train) # 逻辑回归用标准化特征训练 rf = RandomForestClassifier(max_depth=5, random_state=1) rf.fit(X_train, y_train) # 随机森林用原始特征训练,这行就是你之前漏掉的拟合步骤 # 5. 预测 rf_val_proba = rf.predict_proba(X_validation) lr_val_proba = lr.predict_proba(X_val_std)
内容的提问来源于stack exchange,提问作者Sza HGL
相关产品推荐
相关产品推荐

