Как правильно обращаться с двумя наборами данных, когда .dropna () оставляет их разных размеров? - PullRequest
0 голосов
/ 29 апреля 2019

Я тестирую методы машинного обучения, используя сначала набор данных модели, а затем набор тестовых данных (файлы csv).Однако использование df.dropna (inplace = True) оставляет им разные размеры (модель 48470 и тест 48571).Это вызывает множество проблем в моем коде.

Так, например, пока это работает:

linear = linear_model.LinearRegression()

#Model fit to data
linear.fit(xmodel,ymodel.values.ravel())

#Prediction made by model
pred_linear = linear.predict(xtest)
## Compute RMSE
linear_rmse = mean_squared_error(ytest,pred_logit)
print("Linear regression RMSE is ",linear_rmse)
#Linear regression RMSE is  0.07557238168273192 

С другой стороны, у меня возникают проблемы с отображением всех результатов:

x1=np.linspace(0,1,48571)
fig, ax = plt.subplots()
ax.plot(x1, yt, 'o', label="Data")
#ax.plot(x1, y_true, 'b-', label="True")
ax.plot(np.hstack((x1, xmodel)), np.hstack((ym, yt)), 'r', label="OLS prediction")
ax.legend(loc="best");

возвращает

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-124-29b0a94ea028> in <module>
     24 ax.plot(x1, yt, 'o', label="Data")
     25 #ax.plot(x1, y_true, 'b-', label="True")
---> 26 ax.plot(np.hstack((x1, xmodel)), np.hstack((ym, yt)), 'r', label="OLS prediction")
     27 ax.legend(loc="best");

C:\ProgramData\Anaconda3\lib\site-packages\numpy\core\shape_base.py in hstack(tup)
    284     # As a special case, dimension 0 of 1-dimensional arrays is "horizontal"
    285     if arrs and arrs[0].ndim == 1:
--> 286         return _nx.concatenate(arrs, 0)
    287     else:
    288         return _nx.concatenate(arrs, 1)

ValueError: all the input arrays must have same number of dimensions

Аналогичным образом (я считаю, что это связанная проблема, хотя, если это не мои извинения)

reg_model = sm.OLS(endog=ymodel, exog=xmodel)
reg_test = sm.OLS(endog=ytest, exog=xtest)
reg_model.fit()
reg_test.fit()
pred_regmodel=reg_model.predict(xtest)
pred_regtest=reg_test.predict(xtest) #Transpose sorta solved this, but takes forever   #xtest.iloc[9,:].values) technically solved shape problem, but gave false answer
regmodel_rmse = mean_squared_error(ytest,pred_regmodel)
print("OLS RMSE is ",regmodel_rmse)

Возвращает аналогичную несогласованную тусклую ошибку:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-135-3ab9b9511c74> in <module>
      3 reg_model.fit()
      4 reg_test.fit()
----> 5 pred_regmodel=reg_model.predict(xtest)
      6 pred_regtest=reg_test.predict(xtest) #Transpose sorta solved this, but takes forever   #xtest.iloc[9,:].values) technically solved shape problem, but gave false answer
      7 regmodel_rmse = mean_squared_error(ytest,pred_regmodel)

C:\ProgramData\Anaconda3\lib\site-packages\statsmodels\regression\linear_model.py in predict(self, params, exog)
    343             exog = self.exog
    344 
--> 345         return np.dot(exog, params)
    346 
    347     def get_distribution(self, params, scale, exog=None, dist_class=None):

ValueError: shapes (48470,9) and (48571,9) not aligned: 9 (dim 1) != 48571 (dim 0)

Я хотел бы сформировать мой график, чтобы он выглядел как в [7] из этого примера statsmodels .Что касается второго примера, моя цель состоит в том, чтобы использовать мой метод sm.OLS с данными модели или тестовыми данными, сравнить с ytest df, чтобы я мог найти диапазоны MSRE для сравнения с методами logit / lasso / SVC / etc Iиспользовал.

1 Ответ

1 голос
/ 29 апреля 2019

Нет необходимости в том, чтобы поезд и тестовый набор данных были сбалансированы. Вам нужно только то же количество объектов / столбцов, что и для ввода. Ваша первая ошибка из-за того, что x1 и x_model имеют разные размеры, а np.hstack не может складывать разные размеры

Вторая ошибка, я чувствую, что x_test транспонирован. Попробуйте x_test.T()?

...