【问题标题】:'numpy.ndarray' object has no attribute 'columns'“numpy.ndarray”对象没有属性“列”
【发布时间】:2019-11-04 07:20:49
【问题描述】:

我正在尝试找出随机森林分类任务的特征重要性。但它给了我以下错误:

'numpy.ndarray' 对象没有属性'columns'

这是我的代码的一部分:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline


# importing dataset

dataset=pd.read_csv('Churn_Modelling.csv')
X = dataset.iloc[:,3:12].values
Y = dataset.iloc[:,13].values

#spliting dataset into test set and train set

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.20)

from sklearn.ensemble import RandomForestRegressor

regressor = RandomForestRegressor(n_estimators=20, random_state=0)  
regressor.fit(X_train, y_train) 

#feature importance

feature_importances = pd.DataFrame(rf.feature_importances_,index = X_train.columns,columns=['importance']).sort_values('importance',ascending=False)


我希望这应该为我的数据集的每一列提供特征重要性分数。 (注:原始数据为 CSV 格式)

【问题讨论】:

  • 这个错误告诉你到底是什么问题。您正在尝试访问 X_train.columns,但 X_train 是一个 numpy 数组而不是 pandas 数据框,并且它没有属性列

标签: python pandas scikit-learn random-forest


【解决方案1】:

iloc 和 loc 函数只能应用于 Pandas 数据帧。您正在将它们应用到数组中。 解决方案: 将数组转换为数据框,然后应用 iloc 或 loc

【讨论】:

    【解决方案2】:

    使用这个:

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    %matplotlib inline
    
    
    # importing dataset
    
    dataset=pd.read_csv('Churn_Modelling.csv')
    X = dataset.iloc[:,3:12].values
    Y = dataset.iloc[:,13].values
    
    #spliting dataset into test set and train set
    
    from sklearn.model_selection import train_test_split
    X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.20)
    
    from sklearn.ensemble import RandomForestRegressor
    
    regressor = RandomForestRegressor(n_estimators=20, random_state=0)  
    regressor.fit(X_train, y_train) 
    
    #feature importance
    
    feature_importances = pd.DataFrame(regressor.feature_importances_,index = dataset.columns,columns=['importance']).sort_values('importance',ascending=False)
    
    
    

    【讨论】:

    • 它给出以下错误:ValueError:传递值的形状是(468, 1),索引意味着(14, 1)
    • 你能发布数据吗?
    【解决方案3】:

    所以来自train_test_splitX_train 实际上是一个永远不会有列的numpy 数组。 其次,当您从 dataset 创建 X 时,您要求的是值,它返回 numpy.ndarry 而不是 df。

    你需要换行

    feature_importances = pd.DataFrame(rf.feature_importances_,index = X_train.columns,columns=['importance']).sort_values('importance',ascending=False)

    columns_ = dataset.iloc[:1, 3:12].columns

    feature_importances = pd.DataFrame(rf.feature_importances_,index = columns_,columns=['importance']).sort_values('importance',ascending=False)
    

    【讨论】:

    • 这给出了以下错误 - AttributeError: 'numpy.ndarray' object has no attribute 'columns'
    • 即使您将 X_train 替换为 X ?
    • 其次,您需要使用regressor 而不是rf
    • 老兄,很抱歉刚刚更新了答案,我错过了你的价值观X = dataset.iloc[:,3:12].values
    • 我现在能做什么??请有任何建议
    猜你喜欢
    • 2016-06-29
    • 2020-09-22
    • 2020-02-21
    • 2020-12-08
    • 2019-12-10
    • 2017-07-10
    • 2020-05-10
    • 2017-05-24
    • 2021-06-14
    相关资源
    最近更新 更多