当前位置: 首页 > 知识库问答 >
问题:

Python Mens集成:关键错误:"[Int64Index([... dtype='int64',长度=105)]中没有[列]"

柴亦
2023-03-14

下面是一个小版本的代码,其中我得到了这个错误: KeyError:"[Int64Index([...],dtype='int64')]都不在[列]"

'...' 是一系列似乎与我的X和y数据帧的索引匹配的数字。

我使用Mlens包在一个非常大的数据集上与SuperLearner一起建模(因此可伸缩性非常重要)。我的目标是使用数据帧结构,而不是Numpy数组。这将解决下游问题。

到目前为止,我已经探索了这个和其他相关的帖子,但是解决方案似乎不适用于这里。

数据集是在这里作为. csv找到的Iris数据集:

请注意,自定义随机森林函数运行良好。但是mens/SuperLearner错误。

from sklearn.ensemble import ExtraTreesClassifier, RandomForestClassifier
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from mlens.ensemble.super_learner import SuperLearner
import numpy as np
import pandas as pd

df = pd.read_csv("/home/marktest/iris_csv.csv")
type(df)
N_FOLDS = 5
RF_ESTIMATORS = 100
RANDOM_STATE = 42
class RFBasedFeatureSelector(BaseEstimator):
  
    def __init__(self, n_estimators):
        self.n_estimators = n_estimators
        self.selector = None

    def fit(self, X, y):
        clf = RandomForestClassifier(n_estimators=self.n_estimators, random_state = RANDOM_STATE, class_weight = 'balanced')
        clf = clf.fit(X, y)
        self.selector = SelectFromModel(clf, prefit=True, threshold = 0.01)

    def transform(self, X):
        if self.selector is None:
            raise AttributeError('The selector attribute has not been assigned. You cannot call transform before first calling fit or fit_transform.')
        return self.selector.transform(X)

    def fit_transform(self, X, y):
        self.fit(X, y)
        return self.transform(X)
df.head()
X = df.iloc[:,0:3]                                    # split off features into new dataframe
y = df.iloc[:,4]                                     # split off outcome into new dataframe

X, X_val, y, y_val = train_test_split(X, y, test_size=.3, random_state=RANDOM_STATE, stratify=y)
from mlens.metrics import make_scorer
from sklearn.metrics import roc_auc_score, balanced_accuracy_score
accuracy_scorer = make_scorer(roc_auc_score, average='micro', greater_is_better=True)

clf = RandomForestClassifier(RF_ESTIMATORS, random_state=RANDOM_STATE,class_weight='balanced')
scaler = StandardScaler()
feature_selector = RFBasedFeatureSelector(RF_ESTIMATORS)
clf.fit(feature_selector.fit_transform(scaler.fit_transform(X), y), y)
accuracy_score(y_val, clf.predict(feature_selector.transform(scaler.transform(X_val))))

ensemble = SuperLearner(folds=N_FOLDS, shuffle=True, random_state=RANDOM_STATE, scorer=balanced_accuracy_score, backend="threading")

preprocessing = {'pipeline-1': [StandardScaler(), RFBasedFeatureSelector(RF_ESTIMATORS)]
                 
                }

estimators = {'pipeline-1': [RandomForestClassifier(RF_ESTIMATORS, random_state=RANDOM_STATE, class_weight='balanced'),                 
                                         ]
                 }

ensemble.add(estimators, preprocessing)

ensemble.add_meta(LogisticRegression(solver='liblinear', class_weight = 'balanced'))
ensemble.fit(X,y)```

共有1个答案

程仲卿
2023-03-14

我认为问题出在shuffle=True中。我有一个类似的问题,当设置'shuffle=False'时,它不再给出错误消息。

 类似资料:
  • 将测试和列车数据输入ROC曲线图时,我收到以下错误: KeyError:“[Int64Index([0,1,2,…dtype='int64',length=1323])中没有一个在[columns]中” 错误似乎是说它不喜欢我的数据格式,但它在第一次运行时起作用,我无法让它再次运行。 我是否错误地拆分数据或将格式错误的数据发送到函数中? 阅读几个StackOverflow帖子与相同的KeyErro

  • 法典:- 错误 我试图在列和它们的前陈列室价格之间画一个箱线图。前展厅价格的值是分类的,因此,我首先将它们转换为整数,然后尝试绘制箱线图,但它会抛出错误,关键错误:“None of [Int64Index...] dtype='int64]在列中。

  • 有一个323列和10348行的数据帧。我想用下面的代码用分层k-Fold来划分它 但是我得到了以下错误 有人告诉我为什么会出现这个错误以及如何修复它吗

  • 这是我的数据帧: 我试着用它做一个非常简单的情节: 但我一直收到一条关键错误消息: 我尝试将列[a]转换为日期时间,但仍然收到相同的错误消息。

  • 我试图在管道上运行k-折叠交叉验证(标准化定标器,决策树分类器)。 首先,我导入数据。 然后对数据帧进行预处理 然后对特征和目标进行切片 并使用SMOTE来平衡数据 这是问题的一部分。 错误代码

  • 我试图使用np.random.shuffle()方法对索引进行洗牌,但我一直收到一个我不理解的错误。如果有人能帮我解决这个问题,我将不胜感激。非常感谢。 当我在开始创建我的raw_csv_数据变量时,我尝试使用分隔符='、'和delim_空格=0,因为我认为这是另一个问题的解决方案,但它不断抛出相同的错误 这是我尝试洗牌索引时不断遇到的错误: getitem(self,key)中的~\Anacon