39551


Qiita の <https://qiita.com/sugulu/items/5c1b03cd445f27fd3e28>
こちらの投稿を参考に自分でプログラムを書いてみたのですが、トレーニングデータは同じはずなのに元のコードで得られたパラメータと異なるパラメータが算出されてしまいます。

こちらが参考にさせていただいたコードです。

[code]

    import numpy as np
    import pandas as pd
    import matplotlib
    import matplotlib.pylab as plt
    import seaborn as sns
    
    data_file = "./USDJPY_1997_2017.csv"
    data = pd.read_csv(data_file)
    
    # make np.array from DataFrame
    data2 = np.array(data)
    
    # prepare X
    day_ago = 25
    n_shihyou = 1         # features per day: 今回の場合は各日の終値のみ
    # X matrix: (test data) * (features: 25days*終値)
    X = np.zeros((len(data2), day_ago*n_shihyou))
    
    # Set real datas
    for i in range(0, day_ago):
        X[i:len(data2),i] = data2[0:len(data2)-i,4]
    
    # prepare Y
    Y = np.zeros(len(data2))
    # １日後の終値の差をYとする
    pre_day = 1
    Y[0:len(Y)-pre_day] = X[pre_day:len(X), 0] - X[pre_day:len(X), 1]
    
    # Normalize
    original_X = np.copy(X)         # 複製
    tmp_mean = np.zeros(len(X))
    
    for i in range(day_ago,len(X)):            # 25 - 終わりまで
        tmp_mean[i] = np.mean(original_X[i-day_ago+1:i+1,0]) # 25日分の平均値
        for j in range(0, X.shape[1]): 
            X[i,j] = (X[i,j] - tmp_mean[i]) # Xを正規化
        Y[i] =  Y[i]  # X同士の引き算しているので、Yはそのまま
    
    # Training Data ~2017
    X_train = X[200:5193]
    Y_train = Y[200:5193]
    
    # Test Data
    X_test = X[5193:len(X)-pre_day, :]
    Y_test = Y[5193:len(X)-pre_day]
    
    from sklearn import linear_model
    
    linear_reg_model = linear_model.LinearRegression()
    linear_reg_model.fit(X_train, Y_train)
    
    print("回帰式モデルの係数")
    print(linear_reg_model.intercept_) 
    print(linear_reg_model.coef_) 
    
[/code]

私が書いたのが以下のコードです。

[code]

    import numpy as np
    import pandas as pd
    import matplotlib.pylab as plt
    import seaborn as sns
    from sklearn import linear_model
    
    data_file = "./USDJPY_1997_2017.csv"
    data = pd.read_csv(data_file, index_col=[0], parse_dates=True)
    
    last25 = pd.DataFrame(data["Close"])
    last25.columns = ["today"]
    for i in range(24):
        last25[f"{i+1}days_ago"] = data['Close'].shift(i+1)
    
    # pandas.DateFrame to numpy.array
    data_a = np.array(last25)
    
    # Normalize
    # Get mean for 25 days
    days_mean = np.mean(last25.as_matrix(), axis=1)
    mean_a = np.zeros((len(days_mean), 25))     
    for i in range(25): 
        mean_a[:,i] = days_mean
    norm_a = data_a - mean_a
    norm_a = np.nan_to_num(norm_a)      # NaN to 0
    
    # pandas.DataFrame of normalized data X
    X = pd.DataFrame(norm_a)
    X.columns = last25.columns
    X.index = last25.index
    
    # set Y as next day data
    Y = np.array(X['today']) - np.array(X['1days_ago'])
    Y = pd.DataFrame(Y).shift(-1)
    Y.index = X.index
    
    # Set training data
    X_train = X.ix[:'2017-01-01']
    X_train = X_train.ix[200:]
    Y_train = Y.ix[:'2017-01-01']
    Y_train = Y_train.ix[200:]
    
    # Set test data
    X_test = X.ix['2017-01-01':]
    X_test = X_test[:-1]
    Y_test = Y.ix['2017-01-01':]
    Y_test = Y_test[:-1]
    
    linear_reg_model = linear_model.LinearRegression()
    linear_reg_model.fit(X_train, Y_train)
    
    print("回帰式モデルの係数")
    print(linear_reg_model.intercept_) 
    print(linear_reg_model.coef_) 
    
[/code]

渡しているデータは同じはずなのですが、この後の結果がずれてしまいます。  
もし理由がわかる方がいたら回答お願いします。


CC BY-SA 3.0
2017-11-13T14:55:17.753
39549
2017-11-13T21:07:31.280
26178
question
python scikit-learn
scikit-learnで同じトレーニングデータを使用しても異なるパラメータが得られる


NumPyとPandasの有効桁数の違いが原因だと思います。

のび太と学ぶ「機械学習」【第3話】完成：FX予測プログラム（線形回帰版）  
<https://qiita.com/sugulu/items/5c1b03cd445f27fd3e28>

はNumPyデータでregressionしていますが、こちらのコードはPandasで実行されています。

Linear Regressionは、擬似逆行列を計算するので、有効桁数の差で少し結果が異なるのだと思います。

それ以外には、実際に実行してチェックしてみましたが、オリジナルと違いはありませんでした。


CC BY-SA 3.0
2017-11-13T21:07:31.280
39551
2017-11-13T21:07:31.280
26182
39549
answer