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

numpy.ndarray对象无columns属性报错:机器学习代码调试求助

问题:执行机器学习代码时出现“numpy.ndarray object has no attribute 'columns'”错误

我跟着机器学习教程操作HTRU2数据集,视频里代码运行正常,但自己执行时触发上述错误,运行的代码如下:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from imblearn.over_sampling import RandomOverSampler

cols = ['integrated_mean','integrated_standard_deviation','integrated_excess_kurtosis','integrated_skewness','DM_mean','DM_standard_deviation','DM_excess_kurtosis','DM_skewness','class']
df = pd.read_csv("HTRU_2.data", names = cols)

train, valid, test = np.split(df.sample(frac = 1), [int(0.6*len(df)), int(0.8*len(df))])

def scale_dataset(dataframe, oversample = False):
    X = dataframe[dataframe.columns[:-1]].values
    y = dataframe[dataframe.columns[-1]].values

    scaler = StandardScaler()
    X = scaler.fit_transform(X)

    if oversample:
        ros = RandomOverSampler()
        X, y = ros.fit_resample(X, y)

    data = np.hstack((X, np.reshape(y, (-1, 1))))

    return data, X, y

train, X_train, y_train = scale_dataset(train, oversample = True)
valid, X_train, y_train = scale_dataset(train, oversample = False)
test, X_train, y_train = scale_dataset(train, oversample = False)

错误原因分析

  • 第一次调用scale_dataset(train, oversample=True)时,函数返回的train是numpy数组(通过np.hstack拼接生成),而非原始的Pandas DataFrame
  • 后续调用scale_dataset(train, oversample=False)时,传入的train已经是数组,而数组没有columns属性,执行dataframe[dataframe.columns[:-1]]时直接触发错误
  • 同时代码里重复使用X_train、y_train变量,会导致之前的训练集数据被覆盖,逻辑上也存在问题

解决方案

修改变量命名,避免覆盖原始的DataFrame类型的train/valid/test,用独立变量存储函数返回的数组结果,同时修正变量名的一致性:

# 原始拆分后的train/valid/test为DataFrame,保留不动
train, valid, test = np.split(df.sample(frac = 1), [int(0.6*len(df)), int(0.8*len(df))])

# 使用新变量名存储缩放后的数组,保留原始DataFrame用于函数调用
train_scaled, X_train, y_train = scale_dataset(train, oversample=True)
valid_scaled, X_valid, y_valid = scale_dataset(valid, oversample=False)
test_scaled, X_test, y_test = scale_dataset(test, oversample=False)

说明:scale_dataset函数的第一个参数要求接收Pandas DataFrame,因此必须传入原始拆分后的DataFrame,而非函数返回的numpy数组;同时拆分验证集、测试集的变量名要和训练集对应,避免数据覆盖。

内容的提问来源于stack exchange,提问作者The BorgQueen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 09:55:24