我正在学习文本分类,我用自己的语料库用linnear回归进行分类,如下所示:
from sklearn.linear_model.logistic import LogisticRegression
classifier = LogisticRegression(penalty='l2', C=7)
classifier.fit(training_matrix, y_train)
prediction = classifier.predict(testing_matrix)
我想用scikit learn提供的Restricted Boltzman Machine来增加分类报告,从我阅读的文件中可以看出,这可以用来增加分类召回率、f1得分、准确性等。有人能帮助我增加这一点吗?这是我迄今为止尝试的,提前感谢:
vectorizer = TfidfVectorizer(max_df=0.5,
max_features=None,
ngram_range=(1, 1),
norm='l2',
use_idf=True)
X_train = vectorizer.fit_transform(X_train_r)
X_test = vectorizer.transform(X_test_r)
from sklearn.pipeline import Pipeline
from sklearn.neural_network import BernoulliRBM
logistic = LogisticRegression()
rbm= BernoulliRBM(random_state=0, verbose=True)
classifier = Pipeline(steps=[('rbm', rbm), ('logistic', logistic)])
classifier.fit(X_train, y_train)
首先,您必须理解这里的概念。RBM可以被视为一种强大的聚类算法,并且聚类算法是无监督的,即它们不需要标签。也许,在你的问题中使用RBM的最好方法是,首先训练RBM(它只需要没有标签的数据),然后使用RBM权重来初始化神经网络。为了在输出中获得逻辑回归,你必须向这个神经网络添加一个具有逻辑调节成本函数的输出层,并训练这个神经网络。此设置可能会提高性能。
有几件事可能是错误的。
1.您没有正确校准RBM
查看scikit学习网站上的示例:http://scikit-learn.org/stable/auto_examples/plot_rbm_logistic_classification.html
特别是这些线路:
rbm.learning_rate = 0.06
rbm.n_iter = 20
# More components tend to give better prediction performance, but larger
# fitting time
rbm.n_components = 100
你不能把这些放在任何地方。在示例中,这些是通过使用网格搜索的交叉验证获得的。您也应该这样做,并尝试为自己的问题获得(接近)最佳参数。
此外,你可能还想尝试使用交叉验证来确定其他参数,例如ngram范围(如果你能负担得起内存和执行时间,使用更高级别的ngram通常也会有所帮助。对于某些问题,字符级别的ngrams比单词级别的好)和逻辑回归参数。
2.你只是运气不好
没有任何东西表明,在中间步骤中使用RBM肯定会改善任何绩效衡量标准。它可以,但这不是一条规则,它很可能对你的问题没有任何作用或作用很小。你必须为此做好准备。
这是值得尝试的,因为实施起来应该不需要很长时间,但要准备好去别处看看。
还要看SGD分类器和PassiveAggressiveClassifier。这些可能会提高性能。