问题描述
我在同一个数据集上做过 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 (将#修改为@)