AttributeError: 'NoneType' object has no attribute 'drop' when merging two functions

AttributeError: 'NoneType' object has no attribute 'drop' when merging two functions

我有一个数据框,我使用 XGBoost 预测了 result(所有必要的导入都已完成,我不会再写了):

studentId       testId    result       Length     Words      picture     
s1              t1        0            10         8.50       0            
s1              t2        0            11         9.80       1           
s1              t3        1            11        10.40       1           
s2              t2        0            11         9.80       1           
s2              t4        1            60         9.99       0           
s3              t7        1            40         6.45       0            




cols_to_drop = ['testId', 'studentId']
df.drop(cols_to_drop, axis=1, inplace=True)
X = df.drop('result', axis=1) 
y = df['result']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=5)
model = XGBClassifier() 
model.fit(X_train, y_train) 
y_pred = model.predict(X_test) 

我有这个数据框的一部分,我也可以使用 surprise 以不同的方式预测 result,而不是使用上述所有功能:

studentId       testId            result
s1              t1                0
s1              t2                0
s1              t3                1
s2              t2                0
s2              t4                1
s3              t7                1

reader = Reader(rating_scale=(0, 1))
data = Dataset.load_from_df(df_small[['studentId', 'testId', 'result']], reader)
trainset, testset = train_test_split(data, test_size=0.25)
algo = KNNWithMeans()
algo.fit(trainset)
test = algo.test(testset)
test = pd.DataFrame(test)
test.drop("details", inplace=True, axis=1)
test.columns = ['userId', 'questionId', 'actual', 'cf_predictions']

现在,我想创建一个将两者结合起来并为每个模型分配不同权重的模型。我试着把上面的东西写成函数,然后把所有的东西都写成一个大函数:

def model_1(df):
    cols_to_drop = ['testId', 'studentId']
    new_df=df.drop(cols_to_drop, axis=1, inplace=True)
    X = new_df.drop('result', axis=1) 
    y = new_df['result']
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=5)
    model = XGBClassifier() 
    model.fit(X_train, y_train) 
    y_pred = model.predict(X_test)
    return y_test, y_pred

def model_2(df):
    reader = Reader(rating_scale=(0, 1))
    data = Dataset.load_from_df(df[['studentId', 'testId', 'result']], reader)
    trainset, testset = train_test_split(data, test_size=0.25)
    algo = KNNWithMeans()
    algo.fit(trainset)
    test = algo.test(testset)
    test = pd.DataFrame(test)
    test.drop("details", inplace=True, axis=1)
    test.columns = ['studentId', 'testId', 'actual', 'cf_predictions']
    return test

def merged_models(df):
    first_model = model_1(df)
    second_model = model_2(df)

    prediction = 0.5 * first_model + 0.5 * second_model # weights example
    return prediction

前两个有效,但 merged_models(df) 甚至无法申请 model_1,因为 AttributeError: 'NoneType' object has no attribute 'drop'X = new_df.drop('result', axis=1)。代码可能一团糟,但是有没有什么方法可以结合这两种不同的模型并能够评估这种“混合”?

inplace 设置为 True 时,

df.drop 不会 return 任何东西。它就地修改 DataFrame 和 returns None。您不需要为它们创建新名称。

正如@TimRoberts 指出的那样,new_df.dropinplace=True 不会 return 任何东西(换句话说,returns None)。您可以离开 inplace=False,也可以不重新分配给 new_df

这会起作用:

new_df = df.drop(cols_to_drop, axis=1)

这也是:

new_df = df.copy()
new_df.drop(cols_to_drop, axis=1, inplace=True)