Python遍历DataFrame执行Logistic Regression维度错误求助
解决Logistic Regression循环中的ValueError:Expected 2D array, got 1D array instead
这个报错的根源很明确:Scikit-learn的LogisticRegression模型要求输入的特征数据必须是二维数组(格式为(样本数量, 特征数量)),但你在循环里用X_train[peptide]提取单个特征时,得到的是一维的Pandas Series(格式为(样本数量,)),模型无法识别这种输入格式,所以触发了ValueError。
具体修正方案
我会分两步帮你解决这个问题,同时顺便修正代码里的其他小bug:
1. 把单特征列转换成二维格式
你有两种简单的方式实现:
- 方法一(推荐):用双括号提取列
用X_train[[peptide]]代替X_train[peptide],这样得到的是一个只有一列的DataFrame,天然是二维结构,不需要额外转换。 - 方法二:用reshape重塑数组
如果坚持用Series,可以把它转换成numpy数组后重塑形状:X_train[peptide].values.reshape(-1, 1),reshape(-1,1)会自动根据样本数量调整行数,固定列数为1。
2. 修正代码中的其他问题
你的代码里还有几个小问题会导致运行失败:
LR_scores.append(peptide,acc_score)语法错误:append()只能接收一个参数,要把肽段名和准确率打包成元组传入:LR_scores.append( (peptide, acc_score) )- 变量初始化时的换行问题:多个列表初始化应该分开写,避免语法歧义
logit_roc_auc是列表,但你直接把它赋值成了单个数值,应该改成向列表中追加值
修正后的完整代码
from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score, classification_report, confusion_matrix, roc_curve, auc, roc_auc_score import numpy as np # 初始化存储结果的列表 LR_scores = [] logit_roc_auc =[] y_pred_list = [] # 重命名避免和循环内的y_pred冲突 acc_score_list = [] 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'] 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) ) acc_score_list.append(acc_score) y_pred_list.append(y_pred) # 输出分类报告 print(f"=== 肽段 {peptide} 的分类报告 ===") print(classification_report(y_test, y_pred)) # 输出混淆矩阵 cnf_matrix = confusion_matrix(y_test, y_pred) print("混淆矩阵:") print(cnf_matrix) # 计算ROC-AUC 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.append(roc_auc_score(y_test, y_pred)) print(f"ROC-AUC值:{roc_auc:.4f}\n")
补充说明
你提到这个循环在其他输入列表能正常运行,大概率是因为之前的列表里包含的是多特征列(比如用X_train[peptide_list]提取多列时,得到的是二维DataFrame),所以模型能正常识别。而这次的列表是单个特征的循环,就暴露了维度问题。
内容的提问来源于stack exchange,提问作者thejahcoop
相关产品推荐
相关产品推荐

