加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – SciKit-Learn:使用线性回归的天文误差

发布时间:2020-12-20 13:18:16 所属栏目:Python 来源:网络整理
导读:我试图从标题长度预测文章的页面浏览量文章的文本内容.我使用TFIDF如下: from sklearn.feature_extraction.text import CountVectorizerfrom sklearn.feature_extraction.text import TfidfTransformercorpus = result_df['_text'].tolist()count_vect = Co
我试图从标题长度预测文章的页面浏览量文章的文本内容.我使用TFIDF如下:

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
corpus = result_df['_text'].tolist()
count_vect = CountVectorizer(min_df=1,stop_words='english')
dtm = count_vect.fit_transform(corpus)
word_counts = dtm.toarray()
tfidf_transformer = TfidfTransformer()
tfidf = tfidf_transformer.fit_transform(word_counts)
words_df = pd.DataFrame(tfidf.todense(),columns=count_vect.get_feature_names())

我正在使用这样的标准缩放:

from sklearn import preprocessing
scaler = preprocessing.StandardScaler()
result_df['_title'] = scaler.fit_transform(result_df['_title'])

所以我得到我的X如下:

_title  00  000 0002    0003    000667  000709  000725  001 0013    ... última  últimamente último  única   únicamente  único   únicos  útiles  ??_???  ?????
0   62  0.000000    0.000000    0.0 0.0 0.0 0.0 0.0 0.000000    0.0 ... 0.000000    0.0 0.0 0.0 0.0 0.000000    0.0 0.0 0.0 0.0
1   41  0.000000    0.000000    0.0 0.0 0.0 0.0 0.0 0.000000    0.0 ... 0.000000    0.0 0.0 0.0 0.0 0.000000    0.0 0.0 0.0 0.0
2   53  0.000000    0.020781    0.0 0.0 0.0 0.0 0.0 0.000000    0.0 ... 0.000000

我的Y(目标值)看起来像这样:

0        166.0
1         24.0
2         22.0

现在,我尝试运行基本的线性回归,得到一个绝对天文的均方根误差(RMSE):

from sklearn.model_selection import train_test_split
X_train,X_test,Y_train,Y_test = train_test_split(X.as_matrix(),Y,test_size=0.2)

from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
import numpy as np
lin_reg = LinearRegression()
lin_reg.fit(X_train,Y_train)
views_predictions = lin_reg.predict(X_test)
lin_mse = mean_squared_error(Y_test,views_predictions)
lin_rmse = np.sqrt(lin_mse) //value is 770956447401244.75

我的平均Y值是1,487,它的标准偏差是~8,000,所以这个数字不可能是正确的.即使每次都猜相同的数字也会大大超过这个数字.

有趣的是,当我使用DecisionTreeRegressor时,我看到一个看似合理的RMSE为15053.957646453207(仍然很高但远不及线性回归的RMSE).

知道这里发生了什么吗?

谢谢!

解决方法

如此高的误差的结果很可能是过度拟合.

过度拟合的根本原因是你有很多功能(可能有数万个不同的单词),可能没有那么多的例子.通过线性回归,任何单个特征都可能导致灾难性的错误.

想象一下,例如,在你的火车数据中,“aardvark”这个词在一篇文章中只出现过一次,而且有一篇文章看到1000篇观点比同行更受欢迎.因此,您的线性模型为“aardvark”特征指定了1000的系数.在测试数据中,你有一篇关于aardvarks的文章,其中这个词出现了1000次.你的模特得分为1000000!但一些土豚爱好者只看了3次.所以你有一个999997的erorr.

你怎么能避免这种可怕的过度拟合?

>使用更少的功能.您可以使用CountVectorizer(min_df = 10)对单词进行计数,以仅使用出现在至少10个不同文档中的单词.这将减少你过度拟合稀有词的几率.
>规范您的模型.如果您使用Ridge或Lasso而不是LinearRegression,您可能会获得更好的性能.根据我自己的经验,对tf-idf矩阵的岭回归与GBM和nearal网络一样好.

最后一条建议.您的目标(文章视图)可能具有非常不对称的分布:很少有非常受欢迎的文章和许多不重要的文章.有了这样的目标,该模型可能会被少数顶级文章所主导.为了避免这种情况,您可以对目标进行标准化,通过预测其对数或其他凹变换.它可以从排名的角度改善您的模型性能(例如,增加事实和预测之间的相关性).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读