我使用一个简单的RandomForestProgsor脚本来预测目标变量。我正试图根据我的训练/验证数据编写一个新的CSV,以包括实际值和预测值。然而,当我导出数据时,"预测值"列缺少大约一半的值,并且显示的值与特征/实际值的相关性不好。看起来这些值是随机化的,然后分配给前半行。
为了进行测试,我一开始就尝试不在验证和训练数据之间划分数据。我仍然发现同样的问题。
import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error
from sklearn.model_selection import train_test_split
#file path
My_File_Path = "//path.csv"
#read the file
My_Data = pd.read_csv(My_File_Path)
#drop the null values
My_Data = My_Data.dropna(axis=0)
#define the target variable
y = My_Data.Annualized_2018_Payments
my_features = ['feature1','feature2','feature3']
#define the features
x = My_Data[my_features]
#set the split data
train_x, val_x, train_y, val_y = train_test_split(x, y, random_state = 1)
forest_model = RandomForestRegressor(random_state = 1)
forest_model.fit(train_x, train_y)
WA_My_preds = forest_model.predict(val_x)
print("MAE for validation data is ", mean_absolute_error(val_y, WA_My_preds))
#print(My_Data.columns)
My_Data_Predicted = My_Data
#My_Data_Predicted.append(prediction_column, ignore_index = False, sort=None)
My_Data_Predicted['Predicted_Value'] = pd.DataFrame(data = forest_model.predict(My_Data_Predicted[my_features]))
print("The average predicted value is ", My_Data_Predicted['Predicted_Value'].mean())
print("The average true value is ", My_Data_Predicted['Annualized_2018_Payments'].mean())
#write to csv
My_Data_Predicted.to_csv("//path….Preds.csv")
我希望每一行都有一列,上面写着"预测值"和随机森林回归器预测的值。但是最后一半的行缺少该值。
对于简短的答案和解决方案:
在测试代码的基础上,你应该试试这一行:
My_Data_Predicted['Predicted_Value'] = forest_model.predict(My_Data_Predicted[my_features])
现在这就是为什么会发生这种情况:
我使用自己的数据集进行了测试,看起来问题是这样的:
My_Data_Predicted['Predicted_Value'] = pd.DataFrame(data = forest_model.predict(My_Data_Predicted[my_features]))
看起来,当你把空行放在这里时,会发生什么:
My_Data = My_Data.dropna(axis=0)
您还删除了索引和行,这没有错,但对您的问题很重要。要测试这一点,请尝试My_Data_Predicted.index.max()
获取最高索引,并将其与My_Data_Predicted.shape
进行比较,您会发现有跳过的索引。
这是一个问题的原因是,通过使预测列成为数据帧而不是序列,它会自动尝试基于索引合并新数据。问题是,原始数据帧有一个更高的最大索引,其中有一些间隙,而这个用于预测的新数据帧有顺序索引,因此您的一些预测在合并过程中会被丢弃。
下面是一个简单的例子(注意指数):
My_Data_Predicted predictions My_Data_Predicted (merged)
index a b c index d index a b c d
0 1 4 3 0 1 0 1 4 3 1
3 3 2 7 1 2 3 3 2 7 4
4 2 2 2 2 3 4 2 2 2 5
6 4 3 5 3 4 6 4 3 5 NaN
8 6 2 1 4 5 8 6 2 1 NaN
请注意,在合并的数据帧中,最后两个是NaN
,因为预测数据帧中没有索引6或8。
所有这些都应该通过传递结果来解决,如果预测如下:
My_Data_Predicted['Predicted_Value'] = forest_model.predict(My_Data_Predicted[my_features])
因为该类型是numpy数组,并且不会尝试在索引上合并。