每次我使用 scikit 运行线性回归时都会得到不同的结果

Posted

技术标签:

【中文标题】每次我使用 scikit 运行线性回归时都会得到不同的结果【英文标题】:Getting different result each time I run a linear regression using scikit 【发布时间】:2015-04-24 18:09:22 【问题描述】:

您好,我有一个正在尝试优化的线性回归模型。我正在优化指数移动平均线的跨度和我在回归中使用的滞后变量的数量。

但是,我不断发现结果和计算出的 mse 不断得出不同的最终结果。不知道为什么有人可以帮忙?

开始循环后的处理: 1.创建具有三个变量的新数据框 2.删除零值 3. 为每个变量创建 ewma 4.为每个变量创建滞后 5. 删除 NA 6. 创建 X,y 7. 如果 MSE 更好,则回归并保存 ema span 和 lag 数 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)

【问题讨论】:

train_test_split 是来自 sklearn (scikit-learn.org/stable/modules/generated/…) 的函数吗?这是随机的,所以逻辑上你每次都会得到不同的结果。您可以传递一个random_state 关键字以使其每次都相同。 啊,这就解释了,我需要自己做这件事,把前 70% 作为火车,然后在接下来的 30% 上测试 【参考方案1】:

来自 sklearn 的 train_test_split 函数(参见文档:http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.train_test_split.html)是随机的,因此每次得到不同的结果是合乎逻辑的。 您可以将参数传递给 random_state 关键字,使其每次都相同。

【讨论】:

以上是关于每次我使用 scikit 运行线性回归时都会得到不同的结果的主要内容,如果未能解决你的问题,请参考以下文章

每次运行我在 SQL Impala 中使用前导函数时都会得到不同的结果

在 Scikit-Learn 中获得线性回归的大交叉验证分数

scikit-learn 线性回归算法库小结

scikit-learn 线性回归算法库小结

每次运行 iOS 模拟器时都会出现白屏

scikit-learn 线性回归算法库小结