Я не смог исправить эту ошибку. Как решить эту проблему? Спасибо - PullRequest
0 голосов
/ 26 апреля 2020
plt.plot(range(1, len(vt_selector.grid_scores_) + 1), vt_selector.grid_scores_)
Traceback (most recent call last):

  File "<ipython-input-382-35feb916b0a1>", line 1, in <module>
    plt.plot(range(1, len(vt_selector.grid_scores_) + 1), vt_selector.grid_scores_)

**AttributeError: 'VarianceThreshold' object has no attribute 'grid_scores_'**

Мой полный код:

#Feature Selection
import pandas as pd
import numpy as np
from sklearn import preprocessing as pp
from sklearn import model_selection as ms
from sklearn.feature_selection import VarianceThreshold, SelectKBest, chi2, mutual_info_classif, RFECV, SelectFromModel
from sklearn import svm
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.feature_selection import VarianceThreshold
from sklearn.decomposition import PCA
import seaborn
import matplotlib.pyplot as plt
X_orig = pd.read_csv('data.csv',encoding='latin1')  #import CSV dataset and targets
y=pd.read_csv('target.csv')
Xn = pp.normalize(X_orig)   #normalize input using l2 norm
X = pd.DataFrame(Xn)

#remove all low-variance features
vt_selector = VarianceThreshold(threshold=0.01)         
#No feature in X meets the variance threshold 0.01
vt_res = vt_selector.fit_transform(X)
vt_selector.get_support()

#select the k best features using f_classif metric
kb_f_selector = SelectKBest(k=10) 

#x-squares requires features to be strictly positive
from sklearn.preprocessing import MinMaxScaler 
scaler = pp.MinMaxScaler()
X_x2 = MinMaxScaler(feature_range=(0, 1)).fit_transform(X)

#select the k best features using x-squared metric
kb_x2_selector = SelectKBest(chi2, k=10)
kb_x2_res = kb_x2_selector.fit_transform(X_x2, y)

#select the k best features using mutual information metric

selector = SelectKBest(mutual_info_classif, k=10) 
kb_mi_res = selector.fit_transform(X, y)


#recursive feature elimination
estimator = svm.SVC(kernel="linear")
cv = ms.StratifiedShuffleSplit(n_splits=5, test_size=0.2, random_state=42)
rfecv_selector = RFECV(estimator, step=1, cv=cv, scoring='average_precision', verbose=49, n_jobs=-1)
rfecv_selector = selector.fit(X, y)
rfecv_selector.get_support()

#plots: replace vt_selector with desired selector
plt.figure()
plt.xlabel("Number of features selected")
plt.ylabel("Cross validation score")
plt.plot(range(1, len(vt_selector.grid_scores_) + 1), vt_selector.grid_scores_)
plt.show()

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

Просто быстрый совет:

Первое: верно, что объект VarianceThreshold не имеет атрибута grid_scores_. grid_scores_ применяется к GridSearchCV и был исключен и заменен на cv_results_

Второе: вы должны назначить массив vt_selector.get_support (), если вы хотите получить к нему доступ,

    support_vt_selector = vt_selector.get_support()

, иначе это бесполезен, а vt_selector все еще является экземпляром VarianceThreshold в вашем коде и по-прежнему не имеет атрибута grid_scores_.

0 голосов
/ 26 апреля 2020

Я не знаю, что именно вы здесь делаете, но ваш vt_selector является VarianceTreshold объектом, и у него нет поля grid_scores_. Вы можете путать это с RFECV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...