使用逻辑回归进行特征选择

时间:2015-10-26 18:40:19

标签: scikit-learn logistic-regression feature-selection

我正在使用Logistic回归进行特征选择(在具有1,930,388行和88个特征的数据集上)。如果我在保持数据上测试模型,精度只有60%以上。响应变量均匀分布。我的问题是,如果模型的性能不好,我可以考虑它提供的功能作为实际的重要功能吗?或者我应该尝试提高模型的准确性,虽然我的最终目标不是提高准确性而只是获得重要的功能

1 个答案:

答案 0 :(得分:0)

sklearn的GridSearchCV有一些非常简洁的方法可以为您提供最佳的功能集。例如,请考虑以下代码

pipeline = Pipeline([
    ('vect', TfidfVectorizer(stop_words='english',sublinear_tf=True)),
    ('clf', LogisticRegression())
    ])

    parameters = {
        'vect__max_df': (0.25, 0.5, 0.6, 0.7, 1.0),
        'vect__ngram_range': ((1, 1), (1, 2), (2,3), (1,3), (1,4), (1,5)),
        'vect__use_idf': (True, False),
        'clf__C': (0.1, 1, 10, 20, 30)
    }

这里参数数组包含我需要考虑的所有不同参数。注意使用vect__max_df。 max_df是我的矢量化器使用的实际键,它是我的特征选择器。所以,

'vect__max_df': (0.25, 0.5, 0.6, 0.7, 1.0),

实际上指定我想为我的矢量化器尝试上面的5个值。同样适用于其他人。注意我是如何将我的矢量化器绑定到键'vect'而我的分类器绑定到键'clf'。你能看到这种模式吗?继续前进

    traindf = pd.read_json('../../data/train.json')

    traindf['ingredients_clean_string'] = [' , '.join(z).strip() for z in traindf['ingredients']]  

    traindf['ingredients_string'] = [' '.join([WordNetLemmatizer().lemmatize(re.sub('[^A-Za-z]', ' ', line)) for line in lists]).strip() for lists in traindf['ingredients']]       

    X, y = traindf['ingredients_string'], traindf['cuisine'].as_matrix()

    X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.7)

    grid_search = GridSearchCV(pipeline, parameters, n_jobs=3, verbose=1, scoring='accuracy')
    grid_search.fit(X_train, y_train)

    print ('best score: %0.3f' % grid_search.best_score_)
    print ('best parameters set:')

    bestParameters = grid_search.best_estimator_.get_params()

    for param_name in sorted(parameters.keys()):
        print ('\t %s: %r' % (param_name, bestParameters[param_name]))

    predictions = grid_search.predict(X_test)
    print ('Accuracy:', accuracy_score(y_test, predictions))
    print ('Confusion Matrix:', confusion_matrix(y_test, predictions))
    print ('Classification Report:', classification_report(y_test, predictions))

请注意,bestParameters数组将为我提供在创建管道时指定的所有选项中的最佳参数集。

希望这有帮助。

修改:获取所选功能列表

因此,一旦获得了最佳参数集,请使用这些参数值创建矢量化程序和分类器

vect = TfidfVectorizer('''use the best parameters here''')

然后你基本上再次训练这个矢量化器。这样,矢量化器将从训练集中选择某些特征。

traindf = pd.read_json('../../data/train.json')

        traindf['ingredients_clean_string'] = [' , '.join(z).strip() for z in traindf['ingredients']]  

        traindf['ingredients_string'] = [' '.join([WordNetLemmatizer().lemmatize(re.sub('[^A-Za-z]', ' ', line)) for line in lists]).strip() for lists in traindf['ingredients']]       

        X, y = traindf['ingredients_string'], traindf['cuisine'].as_matrix()

        X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.7)

       termDocMatrix = vect.fit_transform(X_train, y_train)

现在,术语DomMatrix具有所有选定的功能。此外,您可以使用矢量化器来获取功能名称。假设您希望获得前100个功能。并且您的比较指标是卡方评分

getKbest = SelectKBest(chi2, k = 100)

现在只是

print(np.asarray(vect.get_feature_names())[getKbest.get_support()])

应该为您提供前100个功能。试试这个。