使用,为回归准备词袋数据

use*_*872 1 python text regression machine-learning scikit-learn

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

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

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

Vectorexample_with_k_8 = [0,0,0,1,0,3,0,0]
Run Code Online (Sandbox Code Playgroud)

我的数据通常像示例中一样稀疏。

当我在测试数据上测试模型时,我得到的 r² 分数非常低(0.00-0.1),有时甚至是负分。该模型总是预测相同的年龄,这恰好是我的数据集的平均年龄,如我的数据分布(年龄/数量)所示: 年龄人口学

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

所以问题是:

1.如何提高r²分数?

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

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

Zic*_*ang 5

据我所知,词袋模型通常使用朴素贝叶斯作为分类器来拟合逐项文档稀疏矩阵。

您的回归量都不能很好地处理大型稀疏矩阵。如果您有一组高度相关的特征,套索可能会很好地工作。

我认为对于您的问题,潜在语义分析可能会提供更好的结果。本质上,使用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]))
Run Code Online (Sandbox Code Playgroud)