Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从scikit学习模型列表中迭代预测_Python_List_For Loop_Scikit Learn - Fatal编程技术网

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,因为你得到以上

有关浅拷贝和深拷贝的更多信息,请参见此问题:-

为了使用相同类型的估计器填充列表,scikit具有一个将返回与提供的相同的新对象的函数。你可以做:

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,因为你得到以上

有关浅拷贝和深拷贝的更多信息,请参见此问题:-

为了使用相同类型的估计器填充列表,scikit具有一个将返回与提供的相同的新对象的函数。你可以做:

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我已编辑了答案,以包含您用例的解决方案