python – SciKit-Learn:使用线性回归的天文误差
我试图从标题长度预测文章的页面浏览量文章的文本内容.我使用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个不同文档中的单词.这将减少你过度拟合稀有词的几率. 最后一条建议.您的目标(文章视图)可能具有非常不对称的分布:很少有非常受欢迎的文章和许多不重要的文章.有了这样的目标,该模型可能会被少数顶级文章所主导.为了避免这种情况,您可以对目标进行标准化,通过预测其对数或其他凹变换.它可以从排名的角度改善您的模型性能(例如,增加事实和预测之间的相关性). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |