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.drop
和 inplace=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)
我有一个数据框,我使用 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.drop
和 inplace=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)