问题描述
我想使用文本数据(描述)作为预测器来预测收入。这是我的数据框的样子:
c_description
641 fierce roman commander marcus vinicius become ...
645 melancholy poet reflect three woman love lose ...
644 disturb blanche dubois move sister new orleans...
643 lonely woman recall first love thirteen year p...
642 three adolescent girl grow bengal india learn ...
d_worldwide_gross_income
641 1034933.275020
645 1089736.217494
644 505025.329393
643 73424.113475
642 544123.669819
这是建模代码:
def model():
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Ridge
import numpy as np
from sklearn import metrics
vectorizer = TfidfVectorizer()
x = vectorizer.fit_transform(model_df['c_description'])
vectorizer.get_feature_names()
y = model_df['d_worldwide_gross_income']
X_train,X_test,y_train,y_test = train_test_split(x,y,test_size=0.3,random_state=1)
clf = Ridge()
clf.fit(X_train,y_train)
pred = clf.predict(X_test)
print(pred)
pred_df = pd.DataFrame({'Actual': y_test,'Predicted': pred})
display(pred_df)
print('Mean Absolute Error:',metrics.mean_absolute_error(y_test,pred))
print('Mean Squared Error:',metrics.mean_squared_error(y_test,pred))
print('Root Mean Squared Error:',np.sqrt(metrics.mean_squared_error(y_test,pred)))
问题是,我得到了负面预测(在输出中加星),这是没有意义的(总收入不能为负)。我认为当您使用包含大量 0 的矢量化文本数据(稀疏矩阵)预测连续变量时,这很常见。但是有没有办法处理这个问题?
输出:
Actual Predicted
14678 6833413.127504 2849365.333598
12631 15076388.644552 7301462.466993
16131 1512745.545534 3046698.088006
4406 25325.846617 **-1436044.714117**
21199 124397.540278 5321914.505052
Mean Absolute Error: 4102039.343052313
Mean Squared Error: 35381871200690.305
Root Mean Squared Error: 5948266.234852834
此外,MSE 高得令人难以置信,模型的准确率似乎很低。我也在寻求有关提高准确性的建议。在这种情况下,分类器是更好的选择吗?
任何意见都将不胜感激,请提前确保每个人的安全。
解决方法
避免遇到负值的一种方法是对目标变量进行日志转换。您可以通过取指数将其转换回您的实际比例。
您的 MSE 会很高,因为您的收入值很高。请记住,您的 MSE 是(预测 - 观察)^2,因此它应该与您的目标值的方差在同一范围内。
要查看您的模型有多好,您可以考虑使用 R 平方。
也是测试数据只有4个观察吗?如果是这样,它可能无法很好地捕捉您的模型性能。
如果这是您拥有的数据,一种改进方法是尝试为 Ridge()
使用不同的超参数。我看到您符合默认设置,您可以尝试不同的 alpha。
最后,您有一个连续的目标变量,很可能您不想为此使用分类器。