【发布时间】:2015-11-13 14:20:39
【问题描述】:
我对机器学习还是很陌生,并且试图自己解决问题。我正在使用 SciKit 学习并拥有一个包含大约 20,000 个特征(n_features=20,000)的推文数据集。到目前为止,我的准确率、召回率和 f1 分数都达到了 79% 左右。我想使用 RFECV 进行特征选择并提高模型的性能。我已经阅读了 SciKit 学习文档,但对如何使用 RFECV 仍然有些困惑。
这是我目前的代码:
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.naive_bayes import MultinomialNB
from sklearn.cross_validation import StratifiedShuffleSplit
from sklearn.cross_validation import cross_val_score
from sklearn.feature_selection import RFECV
from sklearn import metrics
# cross validation
sss = StratifiedShuffleSplit(y, 5, test_size=0.2, random_state=42)
for train_index, test_index in sss:
docs_train, docs_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]
# feature extraction
count_vect = CountVectorizer(stop_words='English', min_df=3, max_df=0.90, ngram_range=(1,3))
X_CV = count_vect.fit_transform(docs_train)
tfidf_transformer = TfidfTransformer()
X_tfidf = tfidf_transformer.fit_transform(X_CV)
# Create the RFECV object
nb = MultinomialNB(alpha=0.5)
# The "accuracy" scoring is proportional to the number of correct classifications
rfecv = RFECV(estimator=nb, step=1, cv=2, scoring='accuracy')
rfecv.fit(X_tfidf, y_train)
X_rfecv=rfecv.transform(X_tfidf)
print("Optimal number of features : %d" % rfecv.n_features_)
# train classifier
clf = MultinomialNB(alpha=0.5).fit(X_rfecv, y_train)
# test clf on test data
X_test_CV = count_vect.transform(docs_test)
X_test_tfidf = tfidf_transformer.transform(X_test_CV)
X_test_rfecv = rfecv.transform(X_test_tfidf)
y_predicted = clf.predict(X_test_rfecv)
#print the mean accuracy on the given test data and labels
print ("Classifier score is: %s " % rfecv.score(X_test_rfecv,y_test))
三个问题:
1) 这是使用交叉验证和 RFECV 的正确方法吗?我特别想知道我是否存在过度拟合的风险。
2) 我用上面的代码实现 RFECV 之前和之后的模型的准确率几乎相同(大约 78-79%),这让我感到困惑。我希望通过使用 RFECV 来提高性能。我可能在这里遗漏了什么或者可以采取不同的方式来提高我的模型的性能?
3) 您还可以推荐我尝试哪些其他特征选择方法?到目前为止,我已经尝试过 RFE 和 SelectKBest,但它们在模型准确性方面都没有给我任何改进。
【问题讨论】:
标签: machine-learning scikit-learn cross-validation feature-selection naivebayes