如何在 sklearn RandomForestRegressor 中正确预测?
How to predict correctly in sklearn RandomForestRegressor?
我正在为我的学校项目做一个大数据项目。我的数据集如下所示:
https://github.com/gindeleo/climate/blob/master/GlobalTemperatures.csv
我正在尝试预测 "LandAverageTemperature" 的下一个值。
首先,我将 csv 导入 pandas 并将其 DataFrame 命名为 "df1"。
在我第一次尝试 sklearn 时出错后,我将 "dt" 列从字符串转换为 datetime64,然后添加了一个名为 "year" 的列,该列仅显示日期值中的年份。-它可能错了-
df1["year"] = pd.DatetimeIndex(df1['dt']).year
完成所有这些之后,我准备好数据进行回归并调用了 RandomForestReggressor:
landAvg = df1[["LandAverageTemperature"]]
year = df1[["year"]]
from sklearn.ensemble import RandomForestRegressor
rf_reg=RandomForestRegressor(n_estimators=10,random_state=0)
rf_reg.fit(year,landAvg.values.ravel())
print("Random forest:",rf_reg.predict(landAvg))
我运行代码,我看到了这个结果:
Random forest: [9.26558115 9.26558115 9.26558115 ... 9.26558115 9.26558115 9.26558115]
我没有收到任何错误,但我认为结果不正确-结果与您看到的完全一样-。此外,当我想获得下一个 10 年的预测时,我不知道该怎么做。我只用这段代码得到 1 个结果。你能帮我改进我的代码并获得正确的结果吗?
在此先感谢您的帮助。
仅使用年份来预测温度是不够的。您也需要使用月份数据。这是初学者的工作示例:
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
df = pd.read_csv('https://raw.githubusercontent.com/gindeleo/climate/master/GlobalTemperatures.csv', usecols=['dt','LandAverageTemperature'], parse_dates=['dt'])
df = df.dropna()
df["year"] = df['dt'].dt.year
df["month"] = df['dt'].dt.month
X = df[["month", "year"]]
y = df["LandAverageTemperature"]
rf_reg=RandomForestRegressor(n_estimators=10,random_state=0)
rf_reg.fit(X, y)
y_pred = rf_reg.predict(X)
df_result = pd.DataFrame({'year': X['year'], 'month': X['month'], 'true': y, 'pred': y_pred})
print('True values and predictions')
print(df_result)
print('Feature importances', list(zip(X.columns, rf_reg.feature_importances_)))
这里是输出:
True values and predictions
year month true pred
0 1750 1 3.034 2.2944
1 1750 2 3.083 2.4222
2 1750 3 5.626 5.6434
3 1750 4 8.490 8.3419
4 1750 5 11.573 11.7569
... ... ... ... ...
3187 2015 8 14.755 14.8004
3188 2015 9 12.999 13.0392
3189 2015 10 10.801 10.7068
3190 2015 11 7.433 7.1173
3191 2015 12 5.518 5.1634
[3180 rows x 4 columns]
Feature importances [('month', 0.9543059863177156), ('year', 0.045694013682284394)]
我正在为我的学校项目做一个大数据项目。我的数据集如下所示: https://github.com/gindeleo/climate/blob/master/GlobalTemperatures.csv
我正在尝试预测 "LandAverageTemperature" 的下一个值。
首先,我将 csv 导入 pandas 并将其 DataFrame 命名为 "df1"。
在我第一次尝试 sklearn 时出错后,我将 "dt" 列从字符串转换为 datetime64,然后添加了一个名为 "year" 的列,该列仅显示日期值中的年份。-它可能错了-
df1["year"] = pd.DatetimeIndex(df1['dt']).year
完成所有这些之后,我准备好数据进行回归并调用了 RandomForestReggressor:
landAvg = df1[["LandAverageTemperature"]]
year = df1[["year"]]
from sklearn.ensemble import RandomForestRegressor
rf_reg=RandomForestRegressor(n_estimators=10,random_state=0)
rf_reg.fit(year,landAvg.values.ravel())
print("Random forest:",rf_reg.predict(landAvg))
我运行代码,我看到了这个结果:
Random forest: [9.26558115 9.26558115 9.26558115 ... 9.26558115 9.26558115 9.26558115]
我没有收到任何错误,但我认为结果不正确-结果与您看到的完全一样-。此外,当我想获得下一个 10 年的预测时,我不知道该怎么做。我只用这段代码得到 1 个结果。你能帮我改进我的代码并获得正确的结果吗? 在此先感谢您的帮助。
仅使用年份来预测温度是不够的。您也需要使用月份数据。这是初学者的工作示例:
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
df = pd.read_csv('https://raw.githubusercontent.com/gindeleo/climate/master/GlobalTemperatures.csv', usecols=['dt','LandAverageTemperature'], parse_dates=['dt'])
df = df.dropna()
df["year"] = df['dt'].dt.year
df["month"] = df['dt'].dt.month
X = df[["month", "year"]]
y = df["LandAverageTemperature"]
rf_reg=RandomForestRegressor(n_estimators=10,random_state=0)
rf_reg.fit(X, y)
y_pred = rf_reg.predict(X)
df_result = pd.DataFrame({'year': X['year'], 'month': X['month'], 'true': y, 'pred': y_pred})
print('True values and predictions')
print(df_result)
print('Feature importances', list(zip(X.columns, rf_reg.feature_importances_)))
这里是输出:
True values and predictions
year month true pred
0 1750 1 3.034 2.2944
1 1750 2 3.083 2.4222
2 1750 3 5.626 5.6434
3 1750 4 8.490 8.3419
4 1750 5 11.573 11.7569
... ... ... ... ...
3187 2015 8 14.755 14.8004
3188 2015 9 12.999 13.0392
3189 2015 10 10.801 10.7068
3190 2015 11 7.433 7.1173
3191 2015 12 5.518 5.1634
[3180 rows x 4 columns]
Feature importances [('month', 0.9543059863177156), ('year', 0.045694013682284394)]