8
9

More than 3 years have passed since last update.

Pythonでお手軽にLASSO回帰分析(理論なし)

Last updated at Posted at 2019-12-01

とりあえず、pythonでLASSO回帰分析を行いたい人向けです。パラメータはいじりません。
使用するデータはこちらhttps://gist.github.com/tijptjik/9408623
*一番下に、全てをまとめたコードがあります。

LASSO回帰用のモジュールをインポート

sklearn.linear_modelの中から、Lassoだけをインポートします。

from sklearn.linear_model import Lasso

データを分割するモジュールをインポート

sklearn.model_selectionの中から、train_test_splitだけをインポートします。

from sklearn.model_selection import train_test_split

行列を扱うモジュールをインポート

numpyをnpという名前で使用できる状態でインポートします。

import numpy as np

csvを扱うモジュールをインポート

pandasをpdという名前で使用できる状態でインポートします。

import pandas as pd

グラフを描くモジュールをインポート

import matplotlib.pyplot as plt

平均平方二乗誤差を求めるモジュールをインポート

from sklearn.metrics import mean_squared_error

csvを読み込む

df(データフレーム)に、iris.csvを読み込む。

df=pd.read_csv('wine_type.csv')

*('iris.csv')はカレントディレクトリからcsvファイルへのアクセスです。
pythonをデスクトップで実行し、Desktop>Documentsにcsvがある場合は、

df=pd.read_csv('Desktop/Documents/wine.csv')

などとなります。(Linux)

データを訓練用、テスト用に分ける

訓練:学習=6:4にします。

df_train, df_test = train_test_split(df, test_size=0.4)

データを表示するとこんな感じです。

df_train=
     wine_type  alcohol  malic_acid   ash  alcalinity_of_ash  magnesium  total_phenols  flavanoids  nonflavanoid_phenols  proanthocyanins  color_intensity   hue  OD280/OD315_of_diluted_wines  proline
106          2    12.25        1.73  2.12               19.0         80           1.65        2.03                  0.37             1.63             3.40  1.00                          3.17      510
157          3    12.45        3.03  2.64               27.0         97           1.90        0.58                  0.63             1.14             7.50  0.67                          1.73      880
75           2    11.66        1.88  1.92               16.0         97           1.61        1.57                  0.34             1.15             3.80  1.23                          2.14      428
142          3    13.52        3.17  2.72               23.5         97           1.55        0.52                  0.50             0.55             4.35  0.89                          2.06      520
83           2    13.05        3.86  2.32               22.5         85           1.65        1.59                  0.61             1.62             4.80  0.84                          2.01      515
..         ...      ...         ...   ...                ...        ...            ...         ...                   ...              ...              ...   ...                           ...      ...
117          2    12.42        1.61  2.19               22.5        108           2.00        2.09                  0.34             1.61             2.06  1.06                          2.96      345
129          2    12.04        4.30  2.38               22.0         80           2.10        1.75                  0.42             1.35             2.60  0.79                          2.57      580
60           2    12.33        1.10  2.28               16.0        101           2.05        1.09                  0.63             0.41             3.27  1.25                          1.67      680
25           1    13.05        2.05  3.22               25.0        124           2.63        2.68                  0.47             1.92             3.58  1.13                          3.20      830
41           1    13.41        3.84  2.12               18.8         90           2.45        2.68                  0.27             1.48             4.28  0.91                          3.00     1035

[106 rows x 14 columns]

説明変数と目的変数を分ける

xには分析に使いたい列を挿入します。(説明変数)
yには分析の結果の列を挿入します。(目的変数)
今回は、'color_intensity'から'proline'を予測します。

x_train = df_train[['color_intensity']]
x_test  = df_test[['color_intensity']]

y_train = df_train['proline']
y_test  = df_test['proline']

空モデルを作る

lss = Lasso()

回帰の学習を行う

fit(説明変数、目的変数)

で学習を行い、上で作ったモデルlssに学習した結果が保持されます。

lss.fit(x_train, y_train)

回帰を行う

predict(回帰分析を行うデータ)

で回帰を行い、y_predに代入します。

y_pred = lss.predict(x_test)

グラフに表示してみる

plt.scatter(x軸、y軸)で散布図を作ることができます。
正答を表示します。(青い点)

plt.scatter(x_test, y_test)

x_test["color_intensity"]の最小値から、最大値まで0.1刻みの配列を作り、行列にします。
そしてlss.predictにかけ、予測値を表示します。(赤い点)

x_for_plot = np.arange(np.min(x_test["color_intensity"])
                      ,np.max(x_test["color_intensity"]),0.1).reshape(-1,1)
plt.scatter(x_for_plot,lss.predict(x_for_plot),color="red")

ラベルの設定

plt.xlabel("color_intensity")
plt.ylabel("proline")

表示

plt.show()

青色が実際の値、赤が予測値というわけです。
スクリーンショット 2019-12-01 22.08.18.png

最後に、平均平方二乗誤差を求めます。

print(mean_squared_error(y_test,y_pred)) #90027.41397601982ですって笑

パラメータをいじるともっと精度が上がると思います。

以下コピペ用コード

from sklearn.linear_model import Lasso
from sklearn.model_selection import train_test_split
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import mean_squared_error
df=pd.read_csv('wine.csv')
df_train, df_test = train_test_split(df, test_size=0.4)
x_train = df_train[['color_intensity']]
x_test  = df_test[['color_intensity']]

y_train = df_train['proline']
y_test  = df_test ['proline']
print(y_train)
lss = Lasso()
lss.fit(x_train, y_train)
y_pred = lss.predict(x_test)

plt.scatter(x_test, y_test)
x_for_plot = np.arange(np.min(x_test["color_intensity"]),np.max(x_test["color_intensity"]),0.1).reshape(-1,1)
plt.scatter(x_for_plot,lss.predict(x_for_plot),color="red")
plt.xlabel("color_intensity")
plt.ylabel("proline")
plt.show()

print(mean_squared_error(y_test,y_pred))
8
9
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9