每次我 运行 使用 scikit 进行线性回归时得到不同的结果
Getting different result each time I run a linear regression using scikit
您好,我有一个线性回归模型,我正在尝试对其进行优化。我正在优化指数移动平均线的跨度和我在回归中使用的滞后变量的数量。
然而我一直发现结果和计算的mse不断得出不同的最终结果。不知道为什么有人可以帮忙?
开始循环后的流程:
1.用三个变量创建新的数据框
2.删除零值
3. 为每个变量创建 ewma
4.为每个变量创建滞后
5. 删除 NA
6. 创建 X,y
7. 如果 MSE 更好,回归并保存 ema 跨度和滞后数
8. 使用下一个值开始循环
我知道这可能是一个交叉验证的问题,但由于它可能是一个程序化的问题,所以我已在此处发布:
bestema = 0
bestlag = 0
mse = 1000000
for e in range(2, 30):
for lags in range(1, 20):
df2 = df[['diffbn','diffbl','diffbz']]
df2 = df2[(df2 != 0).all(1)]
df2['emabn'] = pd.ewma(df2.diffbn, span=e)
df2['emabl'] = pd.ewma(df2.diffbl, span=e)
df2['emabz'] = pd.ewma(df2.diffbz, span=e)
for i in range(0,lags):
df2["lagbn%s" % str(i+1)] = df2["emabn"].shift(i+1)
df2["lagbz%s" % str(i+1)] = df2["emabz"].shift(i+1)
df2["lagbl%s" % str(i+1)] = df2["emabl"].shift(i+1)
df2 = df2.dropna()
b = list(df2)
#print(a)
b.remove('diffbl')
b.remove('emabn')
b.remove('emabz')
b.remove('emabl')
b.remove('diffbn')
b.remove('diffbz')
X = df2[b]
y = df2["diffbl"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
#print(X_train.shape)
regr = linear_model.LinearRegression()
regr.fit(X_train, y_train)
if(mean_squared_error(y_test,regr.predict(X_test)) < mse):
mse = mean_squared_error(y_test,regr.predict(X_test) ** 2)
#mse = mean_squared_error(y_test,regr.predict(X_test))
bestema = e
bestlag = lags
print(regr.coef_)
print(bestema)
print(bestlag)
print(mse)
sklearn 中的 train_test_split
函数(参见文档:http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.train_test_split.html)是随机的,因此每次得到不同的结果是合乎逻辑的。
您可以将参数传递给 random_state
关键字,使其每次都相同。
您好,我有一个线性回归模型,我正在尝试对其进行优化。我正在优化指数移动平均线的跨度和我在回归中使用的滞后变量的数量。
然而我一直发现结果和计算的mse不断得出不同的最终结果。不知道为什么有人可以帮忙?
开始循环后的流程: 1.用三个变量创建新的数据框 2.删除零值 3. 为每个变量创建 ewma 4.为每个变量创建滞后 5. 删除 NA 6. 创建 X,y 7. 如果 MSE 更好,回归并保存 ema 跨度和滞后数 8. 使用下一个值开始循环
我知道这可能是一个交叉验证的问题,但由于它可能是一个程序化的问题,所以我已在此处发布:
bestema = 0
bestlag = 0
mse = 1000000
for e in range(2, 30):
for lags in range(1, 20):
df2 = df[['diffbn','diffbl','diffbz']]
df2 = df2[(df2 != 0).all(1)]
df2['emabn'] = pd.ewma(df2.diffbn, span=e)
df2['emabl'] = pd.ewma(df2.diffbl, span=e)
df2['emabz'] = pd.ewma(df2.diffbz, span=e)
for i in range(0,lags):
df2["lagbn%s" % str(i+1)] = df2["emabn"].shift(i+1)
df2["lagbz%s" % str(i+1)] = df2["emabz"].shift(i+1)
df2["lagbl%s" % str(i+1)] = df2["emabl"].shift(i+1)
df2 = df2.dropna()
b = list(df2)
#print(a)
b.remove('diffbl')
b.remove('emabn')
b.remove('emabz')
b.remove('emabl')
b.remove('diffbn')
b.remove('diffbz')
X = df2[b]
y = df2["diffbl"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
#print(X_train.shape)
regr = linear_model.LinearRegression()
regr.fit(X_train, y_train)
if(mean_squared_error(y_test,regr.predict(X_test)) < mse):
mse = mean_squared_error(y_test,regr.predict(X_test) ** 2)
#mse = mean_squared_error(y_test,regr.predict(X_test))
bestema = e
bestlag = lags
print(regr.coef_)
print(bestema)
print(bestlag)
print(mse)
sklearn 中的 train_test_split
函数(参见文档:http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.train_test_split.html)是随机的,因此每次得到不同的结果是合乎逻辑的。
您可以将参数传递给 random_state
关键字,使其每次都相同。