機械学習学習学習ノート(5)----テスト最小二乗法

3701 ワード

前の文章の中で《機械学習学習学習ノート(4)----線形回帰の数学解析》、最も優れるwを求める方法は普通の最小二乗法(Ordinary Least Squares,OLS)、最小二乗法のpython実現は比較的に簡単です(ols.py):
import numpy as np

class OLSLinearRegression:
    
    def _ols(self, X, y):
        ''' '''
        tmp = np.linalg.inv(np.matmul(X.T, X))
        tmp = np.matmul(tmp, X.T)
        return np.matmul(tmp, y)
    
        # python numpy , 
        # return np.linalg.inv(X.T @ X) @ X.T @ y
    
    def _preprocess_data_X(self, X):
        ''' '''
        
        #  X, x0 1
        m, n = X.shape
        X_ = np.empty((m, n+1))
        X_[:,0] = 1
        X_[:, 1:] = X
        
        return X_
    
    def train(self, X_train, y_train):
        ''' '''
        
        #  X_train( x0 1)
        _X_train = self._preprocess_data_X(X_train)
        
        #  w
        self.w = self._ols(_X_train, y_train)
        
    def predict(self, X):
        ''' '''
        #  X_train( x0 1)
        _X = self._preprocess_data_X(X)
        return np.matmul(_X, self.w)

_ols関数は,最小二乗法の実現である.
_preprocess_data_X関数は、Xを前処理し、x 0列を追加して1に設定します.
train関数は訓練に用いられ,predict関数は予測に用いられる.
ワインの食感データセットを使用して、上の最小二乗法をテストし、ワインデータセットの経路:https://archive.ics.uci.edu/ml/datasets/wine+quality,winequality-red.csv.
データセットを先にロード:
>>> import numpy as np >>> data = np.genfromtxt('winequality-red.csv',delimiter=';',skip_header=True) >>> X=data[:,:-1] >>> X array([[ 7.4  ,  0.7  ,  0.   , ...,  3.51 ,  0.56 ,  9.4  ],        [ 7.8  ,  0.88 ,  0.   , ...,  3.2  ,  0.68 ,  9.8  ],        [ 7.8  ,  0.76 ,  0.04 , ...,  3.26 ,  0.65 ,  9.8  ],        ...,        [ 6.3  ,  0.51 ,  0.13 , ...,  3.42 ,  0.75 , 11.   ],        [ 5.9  ,  0.645,  0.12 , ...,  3.57 ,  0.71 , 10.2  ],        [ 6.   ,  0.31 ,  0.47 , ...,  3.39 ,  0.66 , 11.   ]]) >>> y = data[:,-1] >>> y array([5., 5., 5., ..., 6., 5., 6.])
次に、モデルを作成します.
>>> from ols import OLSLinearRegression >>> ols_lr = OLSLinearRegression()
そして、train_test_splitカットトレーニングセットとテストセット:
>>> from sklearn.model_selection import train_test_split >>> X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3)
ここでtest_size=0.3は、テストセットが総サンプルに占める割合が30%であることを示す.
>>> X_train.shape (1119, 11) >>> X_test.shape (480, 11)
そして、トレーニングをします.
>>> ols_lr.train(X_train, y_train)
最後に、予測を行います.
>>> y_pred = ols_lr.predict(X_test)
回帰モデルのパフォーマンスを測定するには、前節で説明した損失関数(平均二乗誤差)を使用します.
>>> from sklearn.metrics import mean_squared_error >>> mse = mean_squared_error(y_test, y_pred) >>> mse 0.4735667694917602
>>> y_train_pred = ols_lr.predict(X_train) >>> mse_train = mean_squared_error(y_train, y_train_pred) >>> mse_train 0.39425252552801526
トレーニングセットのフィット効果はテストセットより優れています.
sklearnライブラリの線形モデルを使用してトレーニングと予測を行い、損失関数を計算します.
>>> from sklearn import linear_model >>> model = linear_model.LinearRegression() >>> model.fit(X_train, y_train) LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False) >>> y_pred = model.predict(X_test) >>> mse = mean_squared_error(y_test, y_pred) >>> mse 0.47356676947363036 >>> y_train_pred = model.predict(X_train) >>> mse_train = mean_squared_error(y_train, y_train_pred) >>> mse_train 0.3942525255280152
我々の例の最小二乗法との効果はそれほど悪くないことが分かったが,sklearnライブラリにおける線形モデルが最小二乗法を用いていることを示した.
参考資料:
『Python機械学習アルゴリズム:原理、実現とケース』