リッジ、ラッソ、SGD回帰をsklearnでやってみた

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 
from sklearn import model_selection, preprocessing, linear_model
import sklearn
sklearn.__version__

#dataset load
df=pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/housing/housing.data', header=None, sep='\s+')
df.columns=['CRIM','ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']
X_rm=df[['RM']].values
X=df.iloc[:, 0:13]
#X=df[['AGE']].values
Y=df['MEDV'].values

#整形
sc=preprocessing.StandardScaler()
sc.fit(X)
X=sc.transform(X)

#学習データとテストデータ分割
X_train, X_test, Y_train, Y_test = model_selection.train_test_split(X, Y, test_size=0.2, random_state=0)

#SGD Regressor
clf = linear_model.SGDRegressor(max_iter=1000)
clf.fit(X_train, Y_train)

#Lasso Regressor------------------------------------------
clf_lasso= linear_model.Lasso(alpha=0.5)
clf_lasso.fit(X_train, Y_train)

# Ridge Regressor------------------------------------------
clf_ridge= linear_model.Ridge(alpha=0.5)
clf_ridge.fit(X_train, Y_train)

print("SGDの係数")
print(clf.intercept_) 
print(clf.coef_)

print("\nLassoの係数")
print(clf_lasso.intercept_) 
print(clf_lasso.coef_) 

print("\nRidgeの係数")
print(clf_ridge.intercept_) 
print(clf_ridge.coef_) 

#テストデータでの誤差比較
Y_pred=clf.predict(X_test)
Y_lasso_pred=clf_lasso.predict(X_test)
Y_ridge_pred=clf_ridge.predict(X_test)

RMS = np.mean((Y_pred - Y_test) ** 2)
RMS_lasso=np.mean((Y_lasso_pred - Y_test) ** 2)
RMS_ridge = np.mean((Y_ridge_pred - Y_test) ** 2)

print("SGD RMSE", RMS)
print("Lasso RMSE", RMS_lasso)
print("Ridge RMSE", RMS_ridge)
SGDの係数
[22.50529262]
[-0.96926518  0.94949489 -0.14527762  0.63794958 -1.6346609   2.68994304
 -0.14346678 -2.84697474  1.62848272 -1.29629315 -2.19507166  0.72119816
 -3.44826026]

Lassoの係数
22.551646497220098
[-0.2022351   0.         -0.          0.34586306 -0.          2.85095977
 -0.         -0.         -0.         -0.24202672 -1.99201487  0.41276179
 -3.49325645]

Ridgeの係数
22.480943943558106
[-1.02136951  1.03522818  0.02450249  0.59611373 -1.84847657  2.6082378
 -0.0912668  -2.89943172  2.08520461 -1.815872   -2.25741944  0.73956343
 -3.5082977 ]

SGD RMSE 33.38872967589145
Lasso RMSE 39.80131790956071
Ridge RMSE 33.49305020158983

pythonで、時系列データを用いて教師あり学習を行うための学習データ作成方法

時系列データを用いて教師あり学習を行うための学習データの作成のための考え方

多変量の時系列データを用いて、教師あり学習によって、ある目的変数のt分後の値の推測したい場合の学習データの作成方法をまとめたいと思います。

この一般的な方法としては、時刻tを基準とし、目的変数の値のみを時刻t +1とシフトさせる方法がとられています。

具体的なpythonを用いた手順を以下に示します。 目的変数:TARGET, 説明変数:A,B,C の乱数時系列データを作成します。

import numpy as np
import pandas as pd
data = np.random.randn(10, 4)# 10x4 の乱数データを生成
indices = pd.date_range('2010-01-01', periods=10)  # インデックス名は日付
columns = ('A', 'B', 'C', 'TARGET')  # カラム名

my_dataframe = pd.DataFrame(data, index=indices, columns=columns)
print(my_dataframe)

out>>
                   A         B         C    TARGET
2010-01-01 -1.874536  0.044969  0.077942  0.089603
2010-01-02 -0.922576 -0.778048  0.883617 -0.709655
2010-01-03 -0.481583  0.987507  1.120371 -0.466234
2010-01-04  0.055468 -2.080869 -0.558581 -0.235064
2010-01-05  1.033512 -0.750830 -0.754168  1.090878
2010-01-06 -0.566832  0.201503 -0.264602 -0.003537
2010-01-07  1.890769  1.358429 -1.041281  0.438978
2010-01-08 -0.175302 -1.191327 -0.457195 -0.287566
2010-01-09  1.672760  0.094620  1.225835 -0.147332
2010-01-10  2.042621 -2.651269 -1.356004 -0.066129

次に目的変数(TARGET)の値を一日ずらします。 例えば2010-01-02の値は、2010-01-01へずらされます。

my_dataframe['TARGET'] = my_dataframe['TARGET'].shift(-1)
my_dataframe

out>>
    A   B   C   TARGET
2010-01-01   -1.874536  0.044969   0.077942   -0.709655
2010-01-02   -0.922576  -0.778048  0.883617   -0.466234
2010-01-03   -0.481583  0.987507   1.120371   -0.235064
2010-01-04   0.055468   -2.080869  -0.558581  1.090878
2010-01-05   1.033512   -0.750830  -0.754168  -0.003537
2010-01-06   -0.566832  0.201503   -0.264602  0.438978
2010-01-07   1.890769   1.358429   -1.041281  -0.287566
2010-01-08    -0.175302  -1.191327  -0.457195  -0.147332
2010-01-09    1.672760   0.094620   1.225835   -0.066129
2010-01-10   2.042621   -2.651269  -1.356004  NaN

このように目的変数の値を推測したい時刻の値へずらすことで教師あり学習のための学習データを作成します。

正規化と標準化の使い分ける一般的な考え方

一般的には標準化を使用する。 正規化の場合、外れ値が大きく影響するためである。 ※画像データの場合は学習コストを下げるため、[0,1]の範囲に収まるよう255.0で割ることで正規化するのが一般的

正規化

使用ケース: - 画像(RGBの強さ[0,255]) - sigmoid, tanhなどの活性化関数を用いる、NNのいくつかのモデル

標準化

使用ケース: - ロジスティック回帰、SVM、NNなど勾配法を用いたモデル - kNN, k-meansなどの距離を用いるモデル - PCA, LDA(潜在的ディリクレ配分法), kernel PCA などのfeature extractionの手法

どちらも使用しないケース:

決定木、ランダムフォレスト

参照

qiita.com