Scikit learn scikit学习线性回归系数爆炸

Scikit learn scikit学习线性回归系数爆炸,scikit-learn,linear-regression,Scikit Learn,Linear Regression,我正在使用scikit learnLinearRegression类来拟合一些数据。我有一个数字、布尔和标称数据的组合,后者被划分为每个类的一个布尔特征。当我尝试拟合4474样本或更少样本时,一切似乎都很好(尚未对保留的数据进行精确拟合评估)。但当我尝试拟合4475或更多样本时,系数会爆炸 以下是4474个样本的系数(我不得不更改特征名称,因此如果这让人难以理解,我很抱歉): 以下是4475个样本的系数: -8851548433742.3105 A=0 -8851548433739.5312

我正在使用
scikit learn
LinearRegression
类来拟合一些数据。我有一个数字、布尔和标称数据的组合,后者被划分为每个类的一个布尔特征。当我尝试拟合
4474
样本或更少样本时,一切似乎都很好(尚未对保留的数据进行精确拟合评估)。但当我尝试拟合
4475
或更多样本时,系数会爆炸

以下是4474个样本的系数(我不得不更改特征名称,因此如果这让人难以理解,我很抱歉):

以下是4475个样本的系数:

-8851548433742.3105  A=0
-8851548433739.5312  A=1
-8851548433731.1660  A=2
-8851548433738.4355  A=3
-8851548433755.1465  A=4
-8851548433740.6699  A=5
-8851548433731.6973  A=6
-8851548433330.8164  A=7
            -0.2412  B
            27.2095  C
 7046334744114.7773  D=0
 7046334744097.5303  D=1
 7046334744112.7656  D=2
    5440635352.3035  E=0
    5440635363.2956  E=1
 -796471905928.9204  F=0
 -796471905913.2181  F=1
 -796471905920.8073  F=2
 -796471905919.8351  F=3
 -796471905916.3661  F=4
 -796471905920.8374  F=5
 -796471906035.3826  F=6
 2596244960233.4243  [intercept]
有趣的是,它似乎了解了标称类是什么,因为它为给定的高级功能提供了与所有其他潜在类大致相似的值(例如,所有
a=*
大致相同)。因此,这些功能的相互排他性似乎是问题的一部分

第4475个样本没有什么特别之处,它实际上与第4474个样本相同。我尝试跳过该示例,得到了相同的效果。基本上,我无法将数据扩展到5k或更大(我有100k个样本,所以我确实需要进一步扩展)

我甚至做了一些过滤(即,删除缺少数据的样本,而不是使用默认值),它也有相同的效果(在这种情况下,我看到过滤后的4342和4343个样本之间的爆炸,即过滤前的4474和4475个样本)。因此,这肯定部分是由于数据中存在一些潜在的怪癖,但这并不意味着这是一种故意的影响,显然不可能


如果你想知道,上面4474个样本的系数对于我使用的数据集来说是有意义的。

你的问题是什么?那么,基本上,我能做些什么来避免这种情况发生?我尝试过的一件事是对目标数据进行日志缩放,但没有帮助。没有标准化/标准化(没有显示代码)?我可以帮忙。没有正规化(没有显示代码)?我可以帮忙。不适用于~5k VAR并不一定意味着不适用于100k VAR(当然取决于算法)。我最好的建议(除了整个规范化、正则化的内容外):使用(将参数设置为与此处的任务等效;例如,惩罚class='none'可能)。@sascha
SGDRegressor
可能很有效,我需要进一步调查以确定。我仍然会得到疯狂的大值,但当标准化时,它们通常看起来是合乎逻辑的。我以前没有做过任何规范化或正则化,除了对名词进行二值化之外,所以代码基本上只是
lm=LinearRegression()
lm.fit(特性、目标)
。我猜
线性回归
符合分析,而
SGDRegressor
使用优化方法(梯度下降)。所以,对于相对较大的数据集来说,这也许只是更安全的赌注?嗯。。。原始回归器基于,并且在数值上应该更稳健(即使在这里它可能失败)。在某些情况下,教授也可能失败。这无疑是适合处理海量数据的方法,也许100k已经被认为是巨大的(而5k则不是)。规范化和标准化总是需要考虑的。你的问题是什么?那么,基本上,我能做些什么来避免这种情况发生?我尝试过的一件事是对目标数据进行日志缩放,但没有帮助。没有标准化/标准化(没有显示代码)?我可以帮忙。没有正规化(没有显示代码)?我可以帮忙。不适用于~5k VAR并不一定意味着不适用于100k VAR(当然取决于算法)。我最好的建议(除了整个规范化、正则化的内容外):使用(将参数设置为与此处的任务等效;例如,惩罚class='none'可能)。@sascha
SGDRegressor
可能很有效,我需要进一步调查以确定。我仍然会得到疯狂的大值,但当标准化时,它们通常看起来是合乎逻辑的。我以前没有做过任何规范化或正则化,除了对名词进行二值化之外,所以代码基本上只是
lm=LinearRegression()
lm.fit(特性、目标)
。我猜
线性回归
符合分析,而
SGDRegressor
使用优化方法(梯度下降)。所以,对于相对较大的数据集来说,这也许只是更安全的赌注?嗯。。。原始回归器基于,并且在数值上应该更稳健(即使在这里它可能失败)。在某些情况下,教授也可能失败。这无疑是适合处理海量数据的方法,也许100k已经被认为是巨大的(而5k则不是)。规范化和标准化总是需要考虑的。
-8851548433742.3105  A=0
-8851548433739.5312  A=1
-8851548433731.1660  A=2
-8851548433738.4355  A=3
-8851548433755.1465  A=4
-8851548433740.6699  A=5
-8851548433731.6973  A=6
-8851548433330.8164  A=7
            -0.2412  B
            27.2095  C
 7046334744114.7773  D=0
 7046334744097.5303  D=1
 7046334744112.7656  D=2
    5440635352.3035  E=0
    5440635363.2956  E=1
 -796471905928.9204  F=0
 -796471905913.2181  F=1
 -796471905920.8073  F=2
 -796471905919.8351  F=3
 -796471905916.3661  F=4
 -796471905920.8374  F=5
 -796471906035.3826  F=6
 2596244960233.4243  [intercept]