Python 从scikit学习模型列表中迭代预测
我有两个数据帧-一个带有预测器(Python 从scikit学习模型列表中迭代预测,python,list,for-loop,scikit-learn,Python,List,For Loop,Scikit Learn,我有两个数据帧-一个带有预测器(df\u learn),一个带有目标(target\u learn)。我想创建一个scikit学习模型列表(ml\u list),每个目标一个。到目前为止,我已经写了这个 import pandas as pd import numpy as np from sklearn.ensemble import GradientBoostingRegressor as GBM df_learn = pd.DataFrame({'x1':[0,0,0,1,1,1], '
df\u learn
),一个带有目标(target\u learn
)。我想创建一个scikit学习模型列表(ml\u list
),每个目标一个。到目前为止,我已经写了这个
import pandas as pd
import numpy as np
from sklearn.ensemble import GradientBoostingRegressor as GBM
df_learn = pd.DataFrame({'x1':[0,0,0,1,1,1], 'x2':[1,0,1,0,1,0], 'x3':[1,1,0,0,0,0]})
target_learn = pd.DataFrame({'y1':[1,0,0,2,2,0], 'y2':[1,1,1,0,1,0]})
target_colnames = ['y1', 'y2']
ml_list = [GBM(n_estimators = 5, max_depth= 2, min_samples_split= 2,
learning_rate=0.1, loss = 'ls')]*2
for i in [0,1] :
ml_list[i] = ml_list[i].fit(df_learn, target_learn[target_colnames[i]])
为了检查这一点,我创建了一个预测列表
pred_list = []
for i in [0,1] :
pred_list.append(ml_list[i].predict(df_learn))
pd.DataFrame.from_items(zip(target_colnames, pred_list))
m1 = GBM(n_estimators = 5, max_depth= 2, min_samples_split= 2,
learning_rate=0.1, loss = 'ls')
m2 = GBM(n_estimators = 5, max_depth= 2, min_samples_split= 2,
learning_rate=0.1, loss = 'ls')
m1 = m1.fit(df_learn, target_learn['y1'])
m2 = m2.fit(df_learn, target_learn['y2'])
p1 = m1.predict(df_learn)
p2 = m2.predict(df_learn)
pd.DataFrame.from_items(zip(target_colnames, [p1,p2]))
结果令我惊讶,因为我对两个目标的预测完全相同
y1 y2
0.80317 0.80317
0.80317 0.80317
0.80317 0.80317
0.39366 0.39366
0.80317 0.80317
0.39366 0.39366
当我分别运行每个模型时(不使用列表),我有两个不同的预测
pred_list = []
for i in [0,1] :
pred_list.append(ml_list[i].predict(df_learn))
pd.DataFrame.from_items(zip(target_colnames, pred_list))
m1 = GBM(n_estimators = 5, max_depth= 2, min_samples_split= 2,
learning_rate=0.1, loss = 'ls')
m2 = GBM(n_estimators = 5, max_depth= 2, min_samples_split= 2,
learning_rate=0.1, loss = 'ls')
m1 = m1.fit(df_learn, target_learn['y1'])
m2 = m2.fit(df_learn, target_learn['y2'])
p1 = m1.predict(df_learn)
p2 = m2.predict(df_learn)
pd.DataFrame.from_items(zip(target_colnames, [p1,p2]))
结果如下
y1 y2
0.710278 0.80317
0.608147 0.80317
0.567309 0.80317
0.901585 0.39366
1.311095 0.80317
0.901585 0.39366
显然,至少有一个for
循环似乎覆盖了列表中前一个成员的结果。我认为这与某些复制/深度复制问题有关。我应该如何修复它?当您执行以下操作时:
ml_list = [GBM(n_estimators = 5, max_depth= 2, min_samples_split= 2,
learning_rate=0.1, loss = 'ls')]*2
Python正在制作对象的浅层副本,以用2个元素填充列表。但这两个变量本质上都指向同一个底层对象
所以当你这样做的时候:
for i in [0,1] :
ml_list[i] = ml_list[i].fit(df_learn, target_learn[target_colnames[i]])
每次都会重新安装基础GBM对象。因此,它只记得最后一次调用fit,即i=1时
您可以通过向列表中添加两个不同的对象而不使用*2
ml_list = [GBM(n_estimators = 5, max_depth= 2, min_samples_split= 2,
learning_rate=0.1, loss = 'ls'),
GBM(n_estimators = 5, max_depth= 2, min_samples_split= 2,
learning_rate=0.1, loss = 'ls')]
然后你会得到不同的结果,每一个i,因为你得到以上
有关浅拷贝和深拷贝的更多信息,请参见此问题:-
est = GBM(n_estimators = 5, max_depth= 2, min_samples_split= 2,
learning_rate=0.1, loss = 'ls')
ml_list = []
from sklearn.base import clone
for i in range(50):
ml_list.append(clone(est))
当您这样做时:
ml_list = [GBM(n_estimators = 5, max_depth= 2, min_samples_split= 2,
learning_rate=0.1, loss = 'ls')]*2
Python正在制作对象的浅层副本,以用2个元素填充列表。但这两个变量本质上都指向同一个底层对象
所以当你这样做的时候:
for i in [0,1] :
ml_list[i] = ml_list[i].fit(df_learn, target_learn[target_colnames[i]])
每次都会重新安装基础GBM对象。因此,它只记得最后一次调用fit,即i=1时
您可以通过向列表中添加两个不同的对象而不使用*2
ml_list = [GBM(n_estimators = 5, max_depth= 2, min_samples_split= 2,
learning_rate=0.1, loss = 'ls'),
GBM(n_estimators = 5, max_depth= 2, min_samples_split= 2,
learning_rate=0.1, loss = 'ls')]
然后你会得到不同的结果,每一个i,因为你得到以上
有关浅拷贝和深拷贝的更多信息,请参见此问题:-
est = GBM(n_estimators = 5, max_depth= 2, min_samples_split= 2,
learning_rate=0.1, loss = 'ls')
ml_list = []
from sklearn.base import clone
for i in range(50):
ml_list.append(clone(est))
这就是我的想法。因此,基本上,如果不键入所需型号数的n倍,就不可能创建列表?(就本例而言,我留下了2个目标,但实际上,我正在处理12个目标,可能需要为可能超过50个的目标这么做…@AshOfFire我编辑了答案,以包括我在某个时候想到的用例解决方案。因此,基本上,如果不键入所需型号数的n倍,就不可能创建列表?(就本例而言,我留下了2个目标,但实际上,我正在处理12个目标,可能需要为可能超过50个的目标这么做…@AshOfFire我已编辑了答案,以包含您用例的解决方案