Pythonでお手軽にLASSO回帰分析（理論なし）

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

##LASSO回帰用のモジュールをインポート
sklearn.linear_modelの中から、Lassoだけをインポートします。

```python
from sklearn.linear_model import Lasso
```

##データを分割するモジュールをインポート
sklearn.model_selectionの中から、train_test_splitだけをインポートします。

```python
from sklearn.model_selection import train_test_split
```
##行列を扱うモジュールをインポート
numpyをnpという名前で使用できる状態でインポートします。

```python
import numpy as np
```

##csvを扱うモジュールをインポート
pandasをpdという名前で使用できる状態でインポートします。

```python
import pandas as pd
```

##グラフを描くモジュールをインポート
```python
import matplotlib.pyplot as plt
```
##平均平方二乗誤差を求めるモジュールをインポート
```python
from sklearn.metrics import mean_squared_error
```


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

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

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

```python
df=pd.read_csv('Desktop/Documents/wine.csv')
```
などとなります。（Linux）

##データを訓練用、テスト用に分ける
訓練：学習＝6:4にします。

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

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

```python
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'を予測します。

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

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

##空モデルを作る

```python
lss = Lasso()
```

##回帰の学習を行う
#####fit（説明変数、目的変数）
で学習を行い、上で作ったモデルlssに学習した結果が保持されます。

```python
lss.fit(x_train, y_train)
```

##回帰を行う
#####predict（回帰分析を行うデータ）
で回帰を行い、y_predに代入します。

```python
y_pred = lss.predict(x_test)
```

##グラフに表示してみる
plt.scatter(x軸、y軸)で散布図を作ることができます。
正答を表示します。（青い点）

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

```python
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")
```

ラベルの設定

```python
plt.xlabel("color_intensity")
plt.ylabel("proline")
```
表示

```python
plt.show()
```
青色が実際の値、赤が予測値というわけです。
![スクリーンショット 2019-12-01 22.08.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455102/b8234d82-cd78-e31b-de06-f8520a5ae4c9.png)





##最後に、平均平方二乗誤差を求めます。
```python
print(mean_squared_error(y_test,y_pred))　#90027.41397601982ですって笑
```

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

##以下コピペ用コード
```python
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))
```