Циклическая логистическая регрессия по фрейму данных в Python

#pandas #numpy #loops #machine-learning #logistic-regression

#pandas #numpy #циклы #машинное обучение #логистическая регрессия

Вопрос:

Я застрял на том, где я ошибаюсь в этом цикле, чтобы выполнить логистическую регрессию для фрейма данных с 25 функциями.

Когда я изменяю его, выдает ошибку: «ValueError: ожидаемый 2D-массив, вместо этого получен 1D-массив: array=[-12.36677125 -12.91946925 -12.89317629 -13.16951215 -12.20588875 -12.44694704 -12.71370778 -12.69351738 -12.89451587 -12.0776727 -12.63723271 -13.39461116 -12.52027792]. Измените свои данные либо с помощью array.reshape(-1, 1), если ваши данные содержат один объект, либо array.reshape(1, -1), если он содержит один образец.»

 peptides = ['AYSLFSYNTQGR','IVLGQEQDSYGGK','EQLTPLIK','SPELQAEAK','SPELQAEAK','ALVQQMEQLR','SGVQQLIQYYQDQK','VVVHPDYR','GFVVAGPSR','CLCACPFK','VVEESELAR','FCDMPVFENSR','GYSIFSYATK',
'EPGCGCCSVCAR',
'LIQGAPTIR',
'YYLQGAK',
'ALGHLDLSGNR',
'DLLLPQPDLR',
'GPLQLER',
'IISIMDEK',
'LQDAEIAR',
'QINDYVEK',
'SVLGQLGITK',
'ADLSGITGAR',
'EQLSLLDR']
  

Это список пептидов, с которыми я хотел бы взаимодействовать. Они должны быть заголовками столбцов в X_train.

 LR_scores = []
logit_roc_auc =[]
y_pred = []
acc_score = []

for peptide in peptides:
    model=LogisticRegression()
    model.fit(X_train[peptide], y_train)
    score = model.score(X_test[peptide], y_test)
    y_pred=model.predict(X_test[peptide])
    acc_score = accuracy_score(y_test, y_pred)
    LR_scores.append(peptide,acc_score)
    
    #Classification Report
    print (classification_report(y_test,y_pred))
    
    #Confusion Matrix
    cnf_matrix = confusion_matrix(y_test,y_pred)
    print(cnf_matrix)
    
    #ROC_AUC Curves
    y_predict_proba = model.predict_proba(X_test[peptide])
    probabilities = np.array(y_predict_proba)[:, 1]
    fpr, tpr, thresholds = roc_curve(y_test, probabilities, pos_label=1)
    roc_auc = auc(fpr, tpr)
    logit_roc_auc = roc_auc_score(y_test, model.predict(X_test[peptide]))
  

Любая помощь приветствуется.

Скриншот из Jupyter Notebook

Этот цикл работает с разными списками ввода

Ответ №1:

Ожидается, что X будет 2D-массивом при подгонке модели, а y — 1D-массивом.

X_train[peptide] возвращает ряд, который представляет собой одномерный массив. Вы можете либо —

 X_train[peptide].shape
#Output  = (nrows,)
  

Вы можете сделать это —

 X_train[[peptide]].shape
#Output = (nrows,1)
  

или

 X_train[peptide].to_numpy().reshape(-1,1)
#Output = (nrows,1)
  

Это должно сработать —

В случае возникновения другой ошибки, то с кодом возникает более одной проблемы. Пожалуйста, также опубликуйте эту ошибку в комментариях.

 for peptide in peptides:
    model=LogisticRegression()
    model.fit(X_train[[peptide]], y_train)
    score = model.score(X_test[[peptide]], y_test)
    y_pred=model.predict(X_test[[peptide]])
    acc_score = accuracy_score(y_test, y_pred)
    LR_scores.append(peptide,acc_score)
    
    #Classification Report
    print (classification_report(y_test,y_pred))
    
    #Confusion Matrix
    cnf_matrix = confusion_matrix(y_test,y_pred)
    print(cnf_matrix)
    
    #ROC_AUC Curves
    y_predict_proba = model.predict_proba(X_test[[peptide]])
    probabilities = np.array(y_predict_proba)[:, 1]
    fpr, tpr, thresholds = roc_curve(y_test, probabilities, pos_label=1)
    roc_auc = auc(fpr, tpr)
    logit_roc_auc = roc_auc_score(y_test, model.predict(X_test[[peptide]]))
  

Комментарии:

1. Я пробовал это, но в итоге получаю следующую ошибку:: Найдены входные переменные с несогласованным количеством выборок: [26, 13]

2. работает ли это? вы используете несколько функций, которые используют данные 2D-поезда и данные 1D y. пожалуйста, убедитесь, что вы вносите эти изменения во ВСЕ из них

3. Я пробовал все это без успеха. Совсем недавно была средняя, которая вызвала эту ошибку: ожидаемый 2D-массив, вместо этого получен 1D-массив: array = [13. 1.]. Измените свои данные либо с помощью array.reshape(-1, 1), если ваши данные имеют один объект, либо array.reshape(1, -1), если он содержит один образец.

4. Я применил эти изменения только к значениям X_train или X_test

5. Я использую этот цикл, но входной список представляет собой комбинацию пептидов, созданных с помощью «combos = list(комбинации(X_train.columns, 4))». Затем я использую «для комбо в комбо», и код работает нормально. Я не уверен, что происходит.