我正在尝试使用机器学习,并且一直在使用基于python的Scikit库。
我希望解决一个'分类'将一大块文本(例如1k-2k字)分类为一个或多个类别的问题。为此,我一直在研究scikit一段时间。
由于我的数据在2-3百万范围内,所以我使用带有HashingVectorizer的SGDClassfier来使用partial_fit学习技术,编码如下:
import pandas as pd
from sklearn.linear_model import SGDClassifier
from sklearn.feature_extraction.text import HashingVectorizer
import numpy as np
from sklearn.externals import joblib
import copy
data = pd.read_csv(
open('train_shuffled.csv'), error_bad_lines=False)
data_all = copy.deepcopy(data)
target = data['category']
del data['category']
cls = np.unique(target)
model = SGDClassifier(loss='log', verbose=1)
vect = HashingVectorizer(stop_words='english', strip_accents='unicode', analyzer='word')
loop = len(target) / 100
for passes in range(0, 5):
count, r = 0, 0
print("Pass " + str(passes + 1))
for q in range(0, loop):
d = nltk.word_tokenize(data['content'][r:r + 100])
d = vect.fit_transform(d)
t = np.array(target[r:r + 100])
model.partial_fit(d, t, cls)
r = r + 100
data = copy.deepcopy(data_all)
data = data.iloc[np.random.permutation(len(data))]
data = data.reset_index(drop=True)
target = data['category']
del data['category']
print(model)
joblib.dump(model, 'Model.pkl')
joblib.dump(vect, 'Vectorizer.pkl')
在学习过程中,我在堆栈中读到一个答案,手动将每次迭代的训练数据随机化为更好的模型。
使用具有默认参数的分类器和矢量化器,我得到了约58.4%的准确度分数。从那以后,我尝试使用Vectorizer和Classifier的不同参数设置,但没有提高准确度。
是否有人能够告诉我,如果出现问题我一直在做什么或者应该采取什么措施来改善模型得分。
任何帮助都将受到高度赞赏。
谢谢!
答案 0 :(得分:1)
1)考虑使用GridSearchCv来调整参数。 http://scikit-learn.org/stable/modules/generated/sklearn.grid_search.GridSearchCV.html
2)考虑特征工程,将现有功能组合到新功能中。例如。使用sklearn中提供的多项式特征,特征选择和特征联合工具。
3)尝试不同的模型。并非所有模型都适用于所有问题。尝试使用更简单模型和某种决策函数的集合来获取这些模型的输出并进行预测。有些是在enesemble模块中,但您可以使用投票分类器来制作自己的模块。
但到目前为止,最好也是最重要的事情,看看数据。查找分类器执行得非常糟糕的示例。为什么表现不好?你可以将它从阅读中分类(即,期望算法对文本的分类器是否合理?)。如果它可以被分类,模型会错过什么。
所有这些将有助于指导下一步做什么。