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

這意味着它將反轉縮放,並從縮放後的值中獲取原始值 –