1

Я пытаюсь решить проблему классификации по заданному набору данных с помощью логистической регрессии (и это не проблема). Чтобы избежать переобучения, я пытаюсь реализовать его с помощью кросс-валидации (и вот в чем проблема): есть что-то, что мне не хватает для завершения программы. Моя цель здесь - определить точность .Логистическая регрессия и кросс-валидация в Python (с sklearn)

Но позвольте мне быть конкретным. Это то, что я сделал:

  1. Я разделить набор на множество поездов и испытательная установка
  2. Я определил модель прогнозирования logregression, который будет использоваться
  3. я использовал метод cross_val_predict (в sklearn.cross_validation) сделать предсказания
  4. Наконец, я измерил точность

Вот код:

import pandas as pd 
import numpy as np 
import seaborn as sns 
from sklearn.cross_validation import train_test_split 
from sklearn import metrics, cross_validation 
from sklearn.linear_model import LogisticRegression 

# read training data in pandas dataframe 
data = pd.read_csv("./dataset.csv", delimiter=';') 
# last column is target, store in array t 
t = data['TARGET'] 
# list of features, including target 
features = data.columns 
# item feature matrix in X 
X = data[features[:-1]].as_matrix() 
# remove first column because it is not necessary in the analysis 
X = np.delete(X,0,axis=1) 
# divide in training and test set 
X_train, X_test, t_train, t_test = train_test_split(X, t, test_size=0.2, random_state=0) 

# define method 
logreg=LogisticRegression() 

# cross valitadion prediction 
predicted = cross_validation.cross_val_predict(logreg, X_train, t_train, cv=10) 
print(metrics.accuracy_score(t_train, predicted)) 

Мои проблемы:

  • Из того, что я понимаю тест набор не следует рассматривать до самого конца и перекрестной проверки должны быть сделаны на обучающем наборе. Вот почему я вставил X_train и t_train в метод cross_val_predict. Thuogh, я получаю высказывание об ошибке:

    ValueError: Found input variables with inconsistent numbers of samples: [6016, 4812]

    где 6016 это количество образцов в наборе данных, и 4812 является количество образцов в обучающей выборки, после того, как набор данных был разделен

  • После этого я не знаю, что делать. Я имею в виду: , когда X_test и t_test входят в игру? Я не понимаю, как я должен использовать их после кросс-валидации и как получить окончательную точность.

бонус вопрос: Я хотел бы также выполнить масштабирования и снижения размерности (через отбор признаков или PCA) в пределах каждой стадии перекрестной проверки. Как я могу это сделать? Я видел, что определение конвейера может помочь с масштабированием, но я не знаю, как применить это ко второй проблеме.

Я бы очень признателен за любую помощь :-)

ответ

1

Здесь работает код опробована на образце dataframe. Первая проблема в вашем коде - целевой массив, а не np.array. У вас также не должно быть целевых данных в ваших функциях. Ниже я иллюстрирую, как вручную разделить данные обучения и тестирования с помощью train_test_split. Я также показываю, как использовать обертку cross_val_score для автоматического разделения, подгонки и оценки.

random.seed(42) 
# Create example df with alphabetic col names. 
alphabet_cols = list(string.ascii_uppercase)[:26] 
df = pd.DataFrame(np.random.randint(1000, size=(1000, 26)), 
        columns=alphabet_cols) 
df['Target'] = df['A'] 
df.drop(['A'], axis=1, inplace=True) 
print(df.head()) 
y = df.Target.values # df['Target'] is not an np.array. 
feature_cols = [i for i in list(df.columns) if i != 'Target'] 
X = df.ix[:, feature_cols].as_matrix() 
# Illustrated here for manual splitting of training and testing data. 
X_train, X_test, y_train, y_test = \ 
    model_selection.train_test_split(X, y, test_size=0.2, random_state=0) 

# Initialize model. 
logreg = linear_model.LinearRegression() 

# Use cross_val_score to automatically split, fit, and score. 
scores = model_selection.cross_val_score(logreg, X, y, cv=10) 
print(scores) 
print('average score: {}'.format(scores.mean())) 

Выходные

 B C D E F G H I J K ... Target 
0 20 33 451 0 420 657 954 156 200 935 ... 253 
1 427 533 801 183 894 822 303 623 455 668 ... 421 
2 148 681 339 450 376 482 834 90 82 684 ... 903 
3 289 612 472 105 515 845 752 389 532 306 ... 639 
4 556 103 132 823 149 974 161 632 153 782 ... 347 

[5 rows x 26 columns] 
[-0.0367 -0.0874 -0.0094 -0.0469 -0.0279 -0.0694 -0.1002 -0.0399 0.0328 
-0.0409] 
average score: -0.04258093018969249 

Полезные ссылки:

+0

Большое спасибо, человек! Я исправил код, и теперь он работает.Цель внутри функций не была действительно проблемой, потому что: -1 в моем коде убрал ее, так как это был последний столбец. Таким образом, реальная проблема, по-видимому, заключалась в том, что цель не была np.array, как вы указали (я сказал, что я действительно не понимаю, каким образом таинственный способ связан с ошибкой размера, возвращаемой машиной lol). Есть ли у вас какие-либо идеи о том, как завершить процесс, например, как сделать окончательный тест? Я немного смущен тем, что я должен сейчас делать. – Harnak

+0

Я изменил свой ответ, чтобы включить завершенный процесс, используя 'model_selection.cross_val_score'. Что касается ошибок размера, то работа между pd.dataframes и np.ndarrays может быть болью. Вы можете печатать тусклые изображения каждого из них, используя 'x.shape' для устранения неполадок. Лучший способ изучить этот материал IMO - это выкопать документы и учебники sklearn. –

+0

Я не уверен, что понимаю это правильно. Итак, использование cross_val_score делает предыдущее разделение ненужным? Я имею в виду: не следует ли перекрестная проверка только на тренировочном наборе, а не на целом? Или, может быть, мне не хватает перекрестной проверки. – Harnak

1

Пожалуйста, смотрите на documentation of cross-validation at scikit, чтобы понять больше.

Также Вы используете cross_val_predict неправильно. То, что он будет делать, это внутренне вызвать cv, который вы поставили (cv = 10), чтобы разделить предоставленные данные (т. Е. X_train, t_train в вашем случае), чтобы снова провести поездку и тест, поместить оценку на поезд и предсказать данные, которые остаются в тесте.

Теперь для использования ваших , y_test, вы должны сначала поместить свой оценщик в данные поезда (cross_val_predict не подходит), а затем использовать его для прогнозирования на тестовых данных, а затем для расчета точности.

Простой фрагмент кода для описания выше (заимствования из вашего кода) (Не читать комментарии и спросить, если что-то не понимаю):

# item feature matrix in X 
X = data[features[:-1]].as_matrix() 
# remove first column because it is not necessary in the analysis 
X = np.delete(X,0,axis=1) 
# divide in training and test set 
X_train, X_test, t_train, t_test = train_test_split(X, t, test_size=0.2, random_state=0) 

# Until here everything is good 
# You keep away 20% of data for testing (test_size=0.2) 
# This test data should be unseen by any of the below methods 

# define method 
logreg=LogisticRegression() 

# Ideally what you are doing here should be correct, until you did anything wrong in dataframe operations (which apparently has been solved) 
#cross valitadion prediction 
#This cross validation prediction will print the predicted values of 't_train' 
predicted = cross_validation.cross_val_predict(logreg, X_train, t_train, cv=10) 
# internal working of cross_val_predict: 
    #1. Get the data and estimator (logreg, X_train, t_train) 
    #2. From here on, we will use X_train as X_cv and t_train as t_cv (because cross_val_predict doesnt know that its our training data) - Doubts?? 
    #3. Split X_cv, t_cv into X_cv_train, X_cv_test, t_cv_train, t_cv_test by using its internal cv 
    #4. Use X_cv_train, t_cv_train for fitting 'logreg' 
    #5. Predict on X_cv_test (No use of t_cv_test) 
    #6. Repeat steps 3 to 5 repeatedly for cv=10 iterations, each time using different data for training and different data for testing. 

# So here you are correctly comparing 'predicted' and 't_train' 
print(metrics.accuracy_score(t_train, predicted)) 

# The above metrics will show you how our estimator 'logreg' works on 'X_train' data. If the accuracies are very high it may be because of overfitting. 

# Now what to do about the X_test and t_test above. 
# Actually the correct preference for metrics is this X_test and t_train 
# If you are satisfied by the accuracies on the training data then you should fit the entire training data to the estimator and then predict on X_test 

logreg.fit(X_train, t_train) 
t_pred = logreg(X_test) 

# Here is the final accuracy 
print(metrics.accuracy_score(t_test, t_pred)) 
# If this accuracy is good, then your model is good. 

Если у вас есть меньше данных или не хотят, чтобы разделить данные в обучение и тестирование, то вы должны использовать подход, предложенный @fuzzyhedge

# Use cross_val_score on your all data 
scores = model_selection.cross_val_score(logreg, X, y, cv=10) 

# 'cross_val_score' will almost work same from steps 1 to 4 
    #5. t_cv_pred = logreg.predict(X_cv_test) and calculate accuracy with t_cv_test. 
    #6. Repeat steps 1 to 5 for cv_iterations = 10 
    #7. Return array of accuracies calculated in step 5. 

# Find out average of returned accuracies to see the model performance 
scores = scores.mean() 

Примечание - также cross_validation лучше всего использовать с gridsearch выяснить параметры оценки, которые лучше всего подходят для данных. Например, используя LogisticRegression, он имеет множество параметров. Но если вы используете

logreg = LogisticRegression() 

будет инициализировать модель только по умолчанию. Возможно, другое значение параметра

logreg = LogisticRegression(penalty='l1', solver='liblinear') 

может работать лучше для ваших данных. Этот поиск лучших параметров - это gridsearch.

Теперь, что касается вашей второй части scaling, dimension reductions и т.д., используя трубопровод. Вы можете обратиться к documentation of pipeline и следующие примеры:

Не стесняйтесь связаться со мной, если нужна помощь.

+0

Хороший вопрос о gridsearch. –

+0

Спасибо. очень полный и полезный ответ! Да, я пытаюсь разобраться в документах sklearn, но я все еще смущался о том, как объединить предыдущий раскол и перекрестное подтверждение. Теперь это намного яснее – Harnak

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

  • Нет связанных вопросов^_^