You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 23:37:43