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.我应该使用哪种回归器/方法进行文本分类?
据我所知,词袋模型通常使用朴素贝叶斯作为分类器来拟合逐项文档稀疏矩阵。
您的回归量都不能很好地处理大型稀疏矩阵。如果您有一组高度相关的特征,套索可能会很好地工作。
我认为对于您的问题,潜在语义分析可能会提供更好的结果。本质上,使用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)
| 归档时间: |
|
| 查看次数: |
2139 次 |
| 最近记录: |