在 Sci-kit 中计算 K-Fold CV 的平均 R-Squared 得分

问题描述

我在同一个数据集上做过 DecisionTreeRegression 和 RandomForestRegression。

对于 RandomForest,我使用了 5 个随机最佳组合,结果都与您预期的结果相似。我已经计算了 R^2、RMSE 和 MAE 的平均值并得到了 R^2:0.7,MAE:145716,RMSE:251828。

对于决策树,我使用了重复 K 折,计算了平均值并得到: R^2:0.29,MAE:121791,RMSE:198280。

尚未对房价响应变量进行任何转换或缩放。

我是统计学的新手,但我很确定 R^2 应该更高,如果在没有进行缩放的情况下同一数据集上的 MAE 和 RMSE 较低。话虽如此,与我正在使用的其他数据集相比,这些数据集的质量相当低,这些数据集在错误分数中产生了适当的比例。

我的问题是,由于这个数据集的质量很差,我确信这个数据集的 DecisionTree 模型会有负的 R2 值以及高于一个的值:是否有可能在如果某些 R^2 值不在 0-1 区间内,或者更可能是我的代码(或其他内容)的逻辑存在问题,则交叉验证会为 R^2 提供任意结果?

def decisionTreeRegression(df,features):
    df = df.sample(frac=1,random_state=0)
    scaler = StandardScaler()
    
    X = df[features]
    y = df[['Price']]

    param_grid = {'max_depth': np.arange(1,40,3)}
    tree = gridsearchcv(DecisionTreeRegressor(),param_grid,return_train_score=False)
    tree.fit(X,y)
    tree_final = DecisionTreeRegressor(max_depth=tree.best_params_['max_depth'])
    cv = RepeatedKFold(n_splits=5,n_repeats=100)
    mae_scores = cross_val_score(tree_final,X,y,scoring='neg_mean_absolute_error',cv=cv,n_jobs=-1)
    mse_scores = cross_val_score(tree_final,scoring='neg_mean_squared_error',n_jobs=-1)
    r2_scores = cross_val_score(tree_final,scoring='r2',n_jobs=-1)
        
    return makescoresCV(mae_scores,mse_scores,r2_scores)
def makescoresCV(mae_scores,r2_scores):
    # convert scores to positive
    mae_scores= absolute(mae_scores)
    mse_scores= absolute(mse_scores)
    # summarize the result
    s_mean = mean(mae_scores)
    s_mean2 = mean(mse_scores)
    s_mean3 = mean(r2_scores)
    return s_mean,np.sqrt(s_mean2),s_mean3

mae,rmse,r2 = decisionTreeRegression(df_de,fe_de)
print("mae : " + str(mae))
print("rmse : " + str(rmse))
print("r2 : " + str(r2))

Console:
mae : 153189.34673362423
rmse : 253284.5137707182
r2 : 0.30183525616923246

随机森林(单独的笔记本):


scaler = StandardScaler()
X = df.drop('Price',axis = 1)
y = df['Price']
X_train,X_test,y_train,y_test = train_test_split(X,test_size=0.2,random_state=123,shuffle=True)

scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)



def evaluate(model,test_features,test_labels):
    predictions = model.predict(test_features)
    rmse = (np.sqrt(mean_squared_error(test_labels,predictions)))
    r2 = r2_score(test_labels,predictions) # from sklearn.metrics
    mae = np.sum(np.absolute((test_labels - predictions))) / len(predictions)

    return mae,r2,rmse

maes = []
rmses = []
r2s = []
for i in range(10):
   rf_random.fit(X_train,y_train)
   best_random = rf_random.best_estimator_
   mae,rmse = evaluate(best_random,y_test)
   maes.append(mae)
   rmses.append(rmse)
   r2s.append(r2)

print("MAE")
print(math.fsum(maes) / len(maes))
print("RMSE")
print(math.fsum(rmses) / len(rmses))
print("R2")
print(math.fsum(r2s) / len(r2s))


Console:
MAE
145716.7264983288
RMSE
251828.40328030512
R2
0.7082730127977784

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)