0

我已经规范化了我的数据并应用了回归分析来预测产量(y)。 但我的预测的输出也给出了标准化(0〜1) 我想在我的正确数据数字我的预测答案,而不是在0到1标准化数据后,使用回归分析如何预测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() 
0使用此代码标准化数据

输出:

<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

首先,你不应该在这种情况下使用正规化。它不会跨功能标准化。它沿着行进行。你可能不需要它。

使用MinMaxScalerRobustScaler来缩放每个功能。有关更多详细信息,请参阅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

我我不明白这个意思是“inverse_transform()函数,它可以将预测的y值转换回原始单位”。你能解释一下吗,请它对我有帮助 –

+1

这意味着它将反转缩放,并从缩放后的值中获取原始值 –