我正在分析花旗自行车公司2019年9月的数据(时间序列数据)以构建预测回归模型。可以在here.中找到该数据集。目前,我正在汇总240万行的数据集,以获取整个月中每个站点每天的每小时需求量。汇总如下所示:
我使用train_test_split拆分了数据集,并应用了各种股票学习算法,这些算法大多来自scikit-learn。但是,这些模型的结果输出的R2值非常低。例如,对于scikit-learn线性回归,我得到的R2为0.09019569965308272,因此模型无法识别数据中的模式。这是线性回归模型的代码:
def lr(X_train, X_test, y_train, y_test):
#Create a linear regression object
reg = LinearRegression()
sc_X = StandardScaler()
X_train, X_test = scaleData(X_train, X_test, "robust")
print(X_train)
print(X_test)
reg.fit(X_train, y_train)
print("reg.score(X, y): {} \n".format(reg.score(X_test, y_test)))
print("reg.coef_: {} \n".format(reg.coef_))
print("reg.intercept_: {} \n".format(reg.intercept_))
pred = reg.predict(X_test)
print("Pred: {} \n".format(pred))
results = pd.DataFrame({'Actual': y_test.flatten(), 'Predicted': pred.flatten()})
print(results)
PlotResultsGetPerformance(results)
lr(X_train, X_test, y_train, y_test)
scaledata
方法:
def scaleData(X_train, X_test, scalingType, X=None):
scaler = []
stype = scalingType.lower()
if stype == "standard":
scaler = StandardScaler()
elif stype == "minmax":
scaler = MinMaxScaler()
elif stype == "robust":
scaler = RobustScaler()
if X == None:
scaler = scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)
return X_train, X_test
else:
X = scaler.fit_transform(X)
return X
运行线性回归算法的输出:
reg.score(X, y): 0.09019569965308272
reg.coef_: [[-4.71123839 0.87411394 -0.1425281 1.33332683]]
reg.intercept_: [4.94247875]
Pred: [[ 4.16553018]
[10.71438879]
[ 5.21549358]
...
[10.23551752]
[ 4.94370368]
[ 4.10551935]]
平均绝对错误:4.833603206597555
均方误差:61.94697363477656
均方根误差:7.870639976188503
R2:0.09019569965308272
似乎是什么问题?是数据问题还是模型问题?任何帮助将不胜感激。
答案 0 :(得分:0)
在这种情况下,我认为您的模型正在遭受under-fitting
(high bias
)的困扰。看起来解释性变量中没有足够的信息。您的数据中需要更多列。您可以创建新列,或尝试查找更多说明性变量并将其添加到模型中。另外,请检查您已经拥有的变量的质量,也许某些转换可以帮助改善预测。以下是更详细的说明:https://towardsdatascience.com/what-are-overfitting-and-underfitting-in-machine-learning-a96b30864690