使用,为回归

时间:2016-05-29 12:41:17

标签: python text machine-learning scikit-learn regression

我试图创建一个预测作者年龄的回归模型。我使用(Nguyen等,2011)作为我的基础。

使用一袋单词模型我计算每个文档的单词出现次数(这是来自委员会的帖子)并为每个帖子创建向量。

我通过使用top-k(k = number)最常用的单词(不使用停用词)作为特征来限制每个向量的大小

Vectorexample_with_k_8 = [0,0,0,1,0,3,0,0]

我的数据通常很稀疏,如例子所示。

当我在测试数据上测试模型时,我获得了非常低的r²分数(0.00-0.1),有时甚至是负分。该模型始终预测相同的年龄,这恰好是我的数据集的平均年龄,如中所见 我的数据分布(年龄/金额): Agedemographic

我使用了不同的回归模型:线性回归,套索, 来自scikit-learn的SGDRegressor没有任何改进。

所以问题是:

1.如何提高r²分数?

2.我是否必须更改数据以更好地适应回归?如果是,采用什么方法?

3.我应该使用哪种回归/方法进行文本分类?

1 个答案:

答案 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]))