2015-10-26 3 views
1

Я выполняю функцию выбора (по набору данных с 1,930,388 рядами и 88 функциями) с использованием логистической регрессии. Если я тестирую модель на данных с выдержкой, точность будет чуть выше 60%. Ответная переменная равномерно распределена. Мой вопрос: если производительность модели не очень хорошая, могу ли я рассмотреть функции, которые она дает как важные важные функции? Или я должен попытаться повысить точность модели, хотя моя конечная цель заключается не в том, чтобы повысить точность, а только получить важные функции.выбор функции с использованием логистической регрессии

+0

Какой у вас переключатель функций? – AbtPst

ответ

0

В GridSearchCV у sklearn есть несколько довольно аккуратных методов, которые дают вам лучший набор функций. Например, рассмотрим следующий код

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 даст мне лучший набор параметров из всех вариантов, которые я указал при создании моего трубопровода.

Надеюсь, это поможет.

Edit: Для того, чтобы получить список функций выбранного

так, как только у вас есть свой лучший набор параметров, создавать vectorizers и классификаторов с тех значений параметров

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) 

В настоящее время терминDocMatrix имеет все выбранные функции. Кроме того, вы можете использовать векторизатор для получения имен функций. скажем, вы хотите получить 100 лучших функций. и ваша метрика для сравнения хи-квадрат счет

getKbest = SelectKBest(chi2, k = 100) 

теперь просто

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

должна дать вам 100 лучших возможностей. попробуй это.

+0

Спасибо за подробное объяснение GridSearch. Но это не отвечает на мой вопрос. Мой вопрос заключался в том, что если я использую какой-либо алгоритм для цели выделения объектов, должен ли я сосредоточиться на точности модели? Например, sk learn методы выбора объектов (http://scikit-learn.org/stable/modules/feature_selection.html) перечисляют случайные леса, логистическую регрессию и т. Д. В качестве стандартных подходов. Как выбрать один из двух методов выбора функций на основе моделей? выбрать на основе точности? – user2736376

+0

Точность - хорошая мера, но вы также должны посмотреть на другие параметры, такие как кривая ROC, точность, отзыв и f-мерка. в зависимости от проблемы, которую вы пытаетесь решить, один или несколько из этих параметров могут быть важными. поэтому он помогает создавать конвейеры, чтобы вы могли сравнивать разные модели. точность является самой простой.кстати, какую проблему вы пытаетесь решить? Каков ваш прецедент? – AbtPst

+0

также, когда вы говорите: «Конечная цель заключается не в повышении точности, а в получении важных функций», вы действительно хотите получить функции, которые выбирает наиболее подходящая модель? то есть вы хотите узнать «вещи», на которые смотрит лучшая модель? – AbtPst

Смежные вопросы