我有一个数据集,我想在这些数据上训练我的模型.在训练之后,我需要知道SVM分类器分类中主要贡献者的特征.
对森林算法有一些称为特征重要性的东西,有什么类似的吗?
我试图从文本语料库中获取最丰富的功能.从这个回答良好的问题我知道这项任务可以按如下方式完成:
def most_informative_feature_for_class(vectorizer, classifier, classlabel, n=10):
labelid = list(classifier.classes_).index(classlabel)
feature_names = vectorizer.get_feature_names()
topn = sorted(zip(classifier.coef_[labelid], feature_names))[-n:]
for coef, feat in topn:
print classlabel, feat, coef
Run Code Online (Sandbox Code Playgroud)
然后:
most_informative_feature_for_class(tfidf_vect, clf, 5)
Run Code Online (Sandbox Code Playgroud)
对于这个classfier:
X = tfidf_vect.fit_transform(df['content'].values)
y = df['label'].values
from sklearn import cross_validation
X_train, X_test, y_train, y_test = cross_validation.train_test_split(X,
y, test_size=0.33)
clf = SVC(kernel='linear', C=1)
clf.fit(X, y)
prediction = clf.predict(X_test)
Run Code Online (Sandbox Code Playgroud)
问题是输出most_informative_feature_for_class:
5 a_base_de_bien bastante (0, 2451) -0.210683496368
(0, 3533) -0.173621065386
(0, 8034) -0.135543062425
(0, 10346) -0.173621065386
(0, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用scikit-learn和随机林分类器预先形成递归特征消除,使用OOB ROC作为对递归过程中创建的每个子集进行评分的方法.
但是,当我尝试使用该RFECV方法时,我收到一个错误说法AttributeError: 'RandomForestClassifier' object has no attribute 'coef_'
随机森林本身没有系数,但它们确实按基尼评分排名.所以,我想知道如何解决这个问题.
请注意,我想使用一种方法,明确地告诉我pandas在最佳分组中选择了我的DataFrame中的哪些功能,因为我使用递归功能选择来尝试最小化我将输入到最终分类器的数据量.
这是一些示例代码:
from sklearn import datasets
import pandas as pd
from pandas import Series
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import RFECV
iris = datasets.load_iris()
x=pd.DataFrame(iris.data, columns=['var1','var2','var3', 'var4'])
y=pd.Series(iris.target, name='target')
rf = RandomForestClassifier(n_estimators=500, min_samples_leaf=5, n_jobs=-1)
rfecv = RFECV(estimator=rf, step=1, cv=10, scoring='ROC', verbose=2)
selector=rfecv.fit(x, y)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/bbalin/anaconda/lib/python2.7/site-packages/sklearn/feature_selection/rfe.py", line 336, in fit
ranking_ = …Run Code Online (Sandbox Code Playgroud) NLTK包提供了一种方法show_most_informative_features()来查找这两个类的最重要的功能,输出如下:
contains(outstanding) = True pos : neg = 11.1 : 1.0
contains(seagal) = True neg : pos = 7.7 : 1.0
contains(wonderfully) = True pos : neg = 6.8 : 1.0
contains(damon) = True pos : neg = 5.9 : 1.0
contains(wasted) = True neg : pos = 5.8 : 1.0
Run Code Online (Sandbox Code Playgroud)
正如在这个问题中所回答的,如何获得scikit-learn分类器的最丰富的功能?,这也适用于scikit-learn.但是,对于二元分类器,该问题的答案仅输出最佳特征本身.
所以我的问题是,我如何识别该特征的相关类,如上面的例子(优秀是pos类中最有用的信息,而seagal在负面类中信息量最大)?
编辑:实际上我想要的是每个班级最丰富的单词列表.我怎样才能做到这一点?谢谢!
由于我的分类器在测试数据上的准确率大约为99%,我有点怀疑并希望深入了解我的NB分类器中最具信息性的功能,以了解它正在学习哪种功能.以下主题非常有用:如何获取scikit-learn分类器的大部分信息功能?
至于我的功能输入,我还在玩,目前我正在测试一个简单的unigram模型,使用CountVectorizer:
vectorizer = CountVectorizer(ngram_range=(1, 1), min_df=2, stop_words='english')
Run Code Online (Sandbox Code Playgroud)
在上述主题中,我发现了以下功能:
def show_most_informative_features(vectorizer, clf, n=20):
feature_names = vectorizer.get_feature_names()
coefs_with_fns = sorted(zip(clf.coef_[0], feature_names))
top = zip(coefs_with_fns[:n], coefs_with_fns[:-(n + 1):-1])
for (coef_1, fn_1), (coef_2, fn_2) in top:
print "\t%.4f\t%-15s\t\t%.4f\t%-15s" % (coef_1, fn_1, coef_2, fn_2)
Run Code Online (Sandbox Code Playgroud)
这给出了以下结果:
-16.2420 114th -4.0020 said
-16.2420 115 -4.6937 obama
-16.2420 136 -4.8614 house
-16.2420 14th -5.0194 president
-16.2420 15th -5.1236 state
-16.2420 1600 -5.1370 senate
-16.2420 16th -5.3868 new
-16.2420 1920 -5.4004 republicans
-16.2420 1961 -5.4262 republican
-16.2420 1981 …Run Code Online (Sandbox Code Playgroud) python classification machine-learning scikit-learn text-classification
我在python中尝试这个Naive Bayes分类器:
classifier = nltk.NaiveBayesClassifier.train(train_set)
print "Naive Bayes Accuracy " + str(nltk.classify.accuracy(classifier, test_set)*100)
classifier.show_most_informative_features(5)
Run Code Online (Sandbox Code Playgroud)
我有以下输出:
可以清楚地看到哪些单词更多地出现在"重要"中,哪些出现在"垃圾邮件"类别中.但我无法使用这些值.我实际上想要一个如下所示的列表:
[[pass,important],[respective,spam],[investment,spam],[internet,spam],[understands,spam]]
Run Code Online (Sandbox Code Playgroud)
我是python的新手并且很难搞清楚所有这些,有人可以帮忙吗?我会非常感激的.
我正在尝试为我的GaussianNB模型获得最重要的功能。这里的代码如何获得scikit-learn分类器的大多数信息功能? 还是在这里如何获得scikit-learn分类器针对不同类别的大多数信息功能?仅在我使用MultinomialNB时有效。否则,如何为我的两个类(故障= 1或故障= 0)中的每一个计算或检索最重要的特征?我的代码是:(不适用于文本数据)
df = df.toPandas()
X = X_df.values
Y = df['FAULT'].values.reshape(-1,1)
gnb = GaussianNB()
y_pred = gnb.fit(X, Y).predict(X)
print(confusion_matrix(Y, y_pred))
print(accuracy_score(Y, y_pred))
Run Code Online (Sandbox Code Playgroud)
其中X_df是一个数据框,其中包含我的每个功能的二进制列。
python classification feature-selection scikit-learn naivebayes
我正在研究这里提供的数据集的机器学习算法.
共有26列数据.大部分都是毫无意义的.我怎样才能有效,快速地确定哪些特征是有趣的 - 哪些特征告诉我这样或那样的特定URL是短暂的还是常绿的(这是数据集中的因变量)?是否有智能的,程序化的scikit学习如何做到这一点,或者它只是一个图形的每个功能对依赖功能('标签',第26列)的图形,并看到有什么影响?
肯定有比这更好的方法!
有人可以帮忙吗?:)
编辑:我找到的分类器的一些代码 - 如何在这里打印出给每个功能的权重?
import numpy as np
import matplotlib.pyplot as plt
from sklearn import metrics,preprocessing,cross_validation
from sklearn.feature_extraction.text import TfidfVectorizer
import sklearn.linear_model as lm
import pandas as p
loadData = lambda f: np.genfromtxt(open(f,'r'), delimiter=' ')
print "loading data.."
traindata = list(np.array(p.read_table('train.tsv'))[:,2])
testdata = list(np.array(p.read_table('test.tsv'))[:,2])
y = np.array(p.read_table('train.tsv'))[:,-1]
tfv = TfidfVectorizer(min_df=3, max_features=None, strip_accents='unicode',
analyzer='word',token_pattern=r'\w{1,}',ngram_range=(1, 2), use_idf=1,smooth_idf=1,sublinear_tf=1)
rd = lm.LogisticRegression(penalty='l2', dual=True, tol=0.0001,
C=1, fit_intercept=True, intercept_scaling=1.0,
class_weight=None, random_state=None)
X_all = traindata + testdata
lentrain = len(traindata) …Run Code Online (Sandbox Code Playgroud) python artificial-intelligence machine-learning feature-detection scikit-learn