使用Auto-MPG数据集训练决策树回归器计算MSE时遇ValueError求助
Auto-MPG数据集训练决策树回归器计算MSE时遇ValueError求助
嘿,我看了你遇到的问题,咱们一步步来排查和解决:
核心错误原因分析
你碰到的ValueError: All the 10 fits failed主要由两个问题导致,其中第一个是最关键的:
- 特征矩阵包含目标变量(数据泄露)
你把X = df,而y = df['mpg'],这意味着特征集合里直接包含了要预测的目标列mpg。模型相当于用答案去预测答案,这种逻辑错误会让scikit-learn无法正常完成拟合,最终所有交叉验证折叠都失败。 min_samples_leaf比例设置可能不合理
你设置了min_samples_leaf=0.26(按样本比例),如果训练集样本量不大,这个比例可能导致每个叶子节点的样本数过少(比如样本数小于4的话,0.26比例连1个样本都凑不够),进而影响决策树的分裂逻辑。
修正后的解决方案
步骤1:正确分离特征与标签
首先要把目标列从特征矩阵中剔除,只保留用于预测的特征:
# 原来的错误写法:X = df(包含mpg列) # 修正后:去掉mpg列作为特征 X = df.drop('mpg', axis=1) y = df['mpg']
步骤2:调整min_samples_leaf参数
建议改成固定的样本数量(比如5、10),这样更稳妥,避免因样本量小导致的叶子节点样本不足问题;如果坚持用比例,要确保训练集样本数乘以比例后得到的数值≥1:
# 示例:改成固定样本数 dt = DecisionTreeRegressor(max_depth=4, min_samples_leaf=5, random_state=SEED)
完整修正代码
import pandas as pd from sklearn.model_selection import train_test_split, cross_val_score from sklearn.tree import DecisionTreeRegressor # 加载数据集 df = pd.read_csv('data/auto-mpg.csv') # 移除无关的car name列 df = df.drop('car name', axis=1) # 正确分离特征和目标变量 X = df.drop('mpg', axis=1) y = df['mpg'] SEED = 1 # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=SEED) # 实例化决策树回归器,调整参数 dt = DecisionTreeRegressor(max_depth=4, min_samples_leaf=5, random_state=SEED) # 计算10折交叉验证的MSE MSE_CV_scores = -cross_val_score(dt, X_train, y_train, cv=10, scoring='neg_mean_squared_error', n_jobs=1) # 计算RMSE RMSE_CV = (MSE_CV_scores.mean())**(1/2) print(f"交叉验证RMSE值:{RMSE_CV:.2f}")
额外说明
- 数据泄露是机器学习中常见的低级错误,一定要确保特征集合里完全不包含目标变量或任何与目标直接相关的泄露信息。
min_samples_leaf的作用是限制叶子节点的最小样本数,设置过小容易过拟合,过大则会导致模型欠拟合,你可以根据训练集的大小调整这个参数。
备注:内容来源于stack exchange,提问作者Sahil Mantoo
相关产品推荐
相关产品推荐

