0

Я нормализую свои данные и применяю регрессионный анализ для прогнозирования урожайности (y). но мой предсказали выход также дает в нормированном (в 0 до 1) Я хочу, чтобы мой предсказанный ответ в моих правильных цифрах данных, а не в 0 до 1.После нормализации данных, используя регрессию anlaysis, как предсказать y?

данные:

Total_yield(y) Rain(x) 
     64799.30 720.1 
     77232.40 382.9 
     88487.70 1198.2 
     77338.20 341.4 
     145602.05 406.4 
     67680.50 325.8 
     84536.20 791.8 
     99854.00 748.6 
     65939.90 1552.6 
     61622.80 1357.7 
     66439.60 344.3 

Далее, у меня есть нормализовать данные, используя этот код:

from sklearn.preprocessing import Normalizer 
import pandas 
import numpy 
dataframe = pandas.read_csv('/home/desktop/yield.csv') 
array = dataframe.values 
X = array[:,0:2] 
scaler = Normalizer().fit(X) 
normalizedX = scaler.transform(X) 
print(normalizedX) 

    Total_yield  Rain 
0  0.999904 0.013858 
1  0.999782 0.020872 
2  0.999960 0.008924 
3  0.999967 0.008092 
4  0.999966 0.008199 
5  0.999972 0.007481 
6  0.999915 0.013026 
7  0.999942 0.010758 
8  0.999946 0.010414 
9  0.999984 0.005627 
10  0.999967 0.008167 

Далее, я использую это значение для расчета нормализовать R-Sqaure используя следующий код:

array=normalizedX 
data = pandas.DataFrame(array,columns=['Total_yield','Rain']) 
import statsmodels.formula.api as smf 
lm = smf.ols(formula='Total_yield ~ Rain', data=data).fit() 
lm.summary() 

Выход:

<class 'statsmodels.iolib.summary.Summary'> 
""" 
          OLS Regression Results        
============================================================================== 
Dep. Variable:   Total_yield R-squared:      0.752 
Model:       OLS Adj. R-squared:     0.752 
Method:     Least Squares F-statistic:      1066. 
Date:    Thu, 09 Feb 2017 Prob (F-statistic):   2.16e-108 
Time:      14:21:21 Log-Likelihood:     941.53 
No. Observations:     353 AIC:       -1879. 
Df Residuals:      351 BIC:       -1871. 
Df Model:       1           
Covariance Type:   nonrobust           
============================================================================== 
       coef std err   t  P>|t|  [95.0% Conf. Int.] 
------------------------------------------------------------------------------ 
Intercept  1.0116  0.001 948.719  0.000   1.009  1.014 
Rain   -0.3013  0.009 -32.647  0.000  -0.319 -0.283 
============================================================================== 
Omnibus:      408.798 Durbin-Watson:     1.741 
Prob(Omnibus):     0.000 Jarque-Bera (JB):   40636.533 
Skew:       -4.955 Prob(JB):       0.00 
Kurtosis:      54.620 Cond. No.       10.3 
============================================================================== 

Теперь, R-квадрат = 0,75,

regression model : y = b0 + b1 *x 

Yield = b0 + b1 * Rain 

Yield = intercept + coefficient for Rain * Rain 

Now when I use my data value for Rain data then it will gives this answer : 
Yield = 1.0116 + (-0.3013 * 720.1(mm)) = -215.95 

-215.95yield is wrong, 

And when I use normalize value for rain data then predicted yield comes in normalize value in between 0 to 1. 

I want predict if rainfall will be 720.1 mm then how many yield will be there? 

If anyone help me how to get predicted yield ? I want to compare Predicted yield vs given yield. 

ответ

2

Во-первых, вы не должны использовать Normalizer в этом случае. Он не нормализует функции. Он делает это по строкам. Вы можете не хотеть этого.

Используйте MinMaxScaler или RobustScaler для масштабирования каждой функции. См. preprocessing docs для более подробной информации.

Во-вторых, эти классы имеют функцию inverse_transform(), которая может преобразовывать предсказанное значение y в исходные единицы.

x = np.asarray([720.1,382.9,1198.2,341.4,406.4,325.8, 
       791.8,748.6,1552.6,1357.7,344.3]).reshape(-1,1) 
y = np.asarray([64799.30,77232.40,88487.70,77338.20,145602.05,67680.50, 
       84536.20,99854.00,65939.90,61622.80,66439.60]).reshape(-1,1) 

scalerx = RobustScaler() 
x_scaled = scalerx.fit_transform(x) 

scalery = RobustScaler()  
y_scaled = scalery.fit_transform(y) 

Позвоните по номеру statsmodel.OLS по этим расширенным данным. Хотя предсказания, первое преобразование данных теста:

x_scaled_test = scalerx.transform([720.1]) 

Применить модель регрессии этого значения и получить результат. Этот результат y будет соответствовать масштабированным данным.

Yield_scaled = b0 + b1 * x_scaled_test 

Таким образом, обратное преобразование для получения данных в исходных единицах.

Yield_original = scalery.inverse_transform(Yield_scaled) 

Но, на мой взгляд, эта линейная модель не даст большой точности, потому что, когда я построил ваши данные, это результат. Rain(x) Yield(y) plot

Эти данные не будут оснащены линейными моделями. Используйте другие методы или получите больше данных.

+0

Когда я использую масштабирование и стандартизацию MinMax, тогда я получу R-квадрат: 0.07, И когда у меня будет использование, я получу R-квадрат: 0.75, поэтому я выбираю, нормализую, хорошо, я буду использовать RobustScaler, –

+0

I я не понимаю этого значения «функция inverse_transform(), которая может преобразовать предсказанное значение y обратно в исходные единицы». вы можете объяснить мне, пожалуйста, это поможет мне –

+1

Это означает, что он инвертирует масштабирование и возвращает исходное значение из масштабированного значения. –

Смежные вопросы