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
相关产品推荐
相关产品推荐

