scikit учить регрессию .predict () тип возвращаемого значения не соответствует - PullRequest
0 голосов
/ 24 января 2019

Я использую три разные модели регрессии из sklearn.linear_model.

linear_model.LinearRegression.predict () и linear_model.Ridge.predict () оба возвращают одинаковый формат (1300, 1 ) в моем конкретном примере.

linear_model.Lasso.predict () при передаче точно таких же входных данных возвращает a (1300,).Это приводит к ошибкам в моей программе, и мое построение не выполняется.

Я пытался убедиться, что я действительно передаю данные того же формата, проверяя с помощью np.shape () каждую используемую переменную.Я проследил его до возвращаемых значений из .predict (), которые отличаются.

# Crashes when .Lasso is included in mdls
# If I only have the first two in the list (LinearRegression and Ridge) it run and plots fine.
mdls=[linear_model.LinearRegression, linear_model.Ridge, linear_model.Lasso]
argdic=[{'fit_intercept':True},{'fit_intercept':True,'alpha':.5},{'fit_intercept':True,'alpha':0.1}]  
i=0      

for m,a in zip(mdls,argdic):

    ## Run regression Fit
    res=m(**a).fit(xsk,ysk)

    predZmesh=res.predict(meshpts)

    predZact=res.predict(actpts)




    reZ=ysk['Eff. At Rated Lift'].values.reshape(len(ysk['Eff. At Rated Lift']),1)

    zerr=np.subtract(predZact,reZ)
    zerr_r=zerr.ravel()


    #Normalize the errror for colormap
    nrm=colors.Normalize(vmin=zerr_r.min(),vmax=zerr_r.max())

    r2=res.score(xsk,ysk)

    #Setup Plot
    ax=fig.add_subplot(1,len(mdls),i+1,projection='3d')

    #Plot scatter of actual data points
    #ax.scatter(xsk['Minor Comp. At Temp'],xsk['Major Comp. At Temp'],ysk,marker='o',alpha=0.9)
    print('Shape of x,y,z,err.ravel={0},{1},{2},{3}'.format(np.shape(xsk['Minor Comp. At Temp']),np.shape(xsk['Major Comp. At Temp']),np.shape(ysk['Eff. At Rated Lift']),np.shape(zerr_r)))

    ax.scatter(xsk['Minor Comp. At Temp'],xsk['Major Comp. At Temp'],ysk['Eff. At Rated Lift'],c=zerr_r,norm=nrm,cmap=plt.cm.get_cmap('RdBu'),marker='o',alpha=0.9)



    ax.plot_surface(xmeshpts,ymeshpts,
          predZmesh.reshape(xmeshpts.shape),color='red',alpha=0.1)

    i+=1    

Должна ли функция регрессии не возвращать данные в том же формате?Когда я читаю документацию, она показывает, что формат соответствует.Может ли кто-нибудь подтвердить, что мое ожидание последовательных возвращаемых значений верно?Тогда я могу продолжить отладку.

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

Это известная проблема , о которой первоначально сообщалось в 2015 году. Проблема возникает, когда вы предоставляете массив y_array с 2 измерениями (test_y.shape = (n, 1)).

Самое простое решение - сгладить массив y_array перед вызовом метода .predict ():

test_y = test_y.flatten()

(Предполагается, что test_y - это пустой массив)

0 голосов
/ 26 января 2019

Вы можете добавить условие, которое проверяет, а затем изменяет выходные данные прогнозов, если используемая модель имеет вид linear_model.Lasso.

Для изменения формы можно использовать следующий код: x = x.reshape(-1,1).

Вот простой пример:

Если у вас есть плоский массив без столбцов, подобных этому:

x = np.array([1,2,3])

Вывод x.shape будет, конечно, (3,).

Затем мы можем изменить его так, чтобы значения сохранялись в виде одного столбца с формой (3,1):

x = x.reshape(-1,1)

После этого вывод x.shape теперь равен * 1021.*.

Визуально, вместо того, чтобы быть плоским списком, массив теперь содержит столбец:

array([[1],
       [2],
       [3]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...