我试图创建一个预测作者年龄的回归模型。我使用(Nguyen等,2011)作为我的基础。
使用一袋单词模型我计算每个文档的单词出现次数(这是来自委员会的帖子)并为每个帖子创建向量。
我通过使用top-k(k = number)最常用的单词(不使用停用词)作为特征来限制每个向量的大小
Vectorexample_with_k_8 = [0,0,0,1,0,3,0,0]
我的数据通常很稀疏,如例子所示。
当我在测试数据上测试模型时,我获得了非常低的r²分数(0.00-0.1),有时甚至是负分。该模型始终预测相同的年龄,这恰好是我的数据集的平均年龄,如中所见 我的数据分布(年龄/金额):
我使用了不同的回归模型:线性回归,套索, 来自scikit-learn的SGDRegressor没有任何改进。
所以问题是:
1.如何提高r²分数?
2.我是否必须更改数据以更好地适应回归?如果是,采用什么方法?
3.我应该使用哪种回归/方法进行文本分类?
答案 0 :(得分:3)
据我所知,Bag-of-words模型通常使用Naive Bayes作为分类器来拟合逐个文档的稀疏矩阵。
没有一个回归量能够很好地处理大型稀疏矩阵。如果您有一组高度相关的功能,Lasso可能会运作良好。
我认为,对于您的问题,Latent Semantic Analysis可能会提供更好的结果。基本上,使用TfidfVectorizer来规范化单词计数矩阵,然后使用TruncatedSVD来减少维度以保留捕获主要方差的前N个分量。大多数回归量应该与较低维度的矩阵一起使用。在我的实验中,SVM对这个问题非常有用。
这里我展示了一个示例脚本:
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import TruncatedSVD
from sklearn import svm
from sklearn.pipeline import Pipeline
from sklearn.grid_search import GridSearchCV
pipeline = Pipeline([
('tfidf', TfidfVectorizer()),
('svd', TruncatedSVD()),
('clf', svm.SVR())
])
# You can tune hyperparameters using grid search
params = {
'tfidf__max_df': (0.5, 0.75, 1.0),
'tfidf__ngram_range': ((1,1), (1,2)),
'svd__n_components': (50, 100, 150, 200),
'clf__C': (0.1, 1, 10),
}
grid_search = GridSearchCV(pipeline, params, scoring='r2',
n_jobs=-1, verbose=10)
# fit your documents (Should be a list/array of strings)
grid_search.fit(documents, y)
print("Best score: %0.3f" % grid_search.best_score_)
print("Best parameters set:")
best_parameters = grid_search.best_estimator_.get_params()
for param_name in sorted(parameters.keys()):
print("\t%s: %r" % (param_name, best_parameters[param_name]))