機械学習 〜 データセット生成 〜

今回は scikit-learn の データセット生成を試してみます。

# 回帰データセット生成

## make_regression
[sklearn.datasets.make_regression](http://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_regression.html) クラスを使用します。

#### 引数

|引数|内容|
|:-----------------|:------------------|
|n_samples|サンプル数|
|n_features|特徴量の数|
|n_informative|目的変数のラベルと相関が強い特徴量の数|
|noise|ガウシアンノイズの標準偏差|
|bias|バイアス(切片)|
|coef|True設定時、基礎となる線形モデルの重みを返却 (default=False)|

#### インポート

```python
%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
```

#### データセット生成

特徴量の数を 4、目的変数に対して相関の強い特徴量の数を 2、
ノイズを 10.0 に設定してデータセットを生成します。

```python
from sklearn.datasets import make_regression

X, Y, coef = make_regression(random_state=12, 
                       n_samples=100, 
                       n_features=4,
                       n_informative=2,
                       noise=10.0,
                       bias=-0.0,
                       coef=True)

print("X =", X[:5])
print("Y =", Y[:5])
print("coef =", coef)

plt.figure(figsize=(20, 4))
plt.subplot(1, 4, 1)
plt.title("Feature 1")
plt.plot(X[:, 0], Y, "bo")
plt.subplot(1, 4, 2)
plt.title("Feature 2")
plt.plot(X[:, 1], Y, "ro")
plt.subplot(1, 4, 3)
plt.title("Feature 3")
plt.plot(X[:, 2], Y, "go")
plt.subplot(1, 4, 4)
plt.title("Feature 4")
plt.plot(X[:, 3], Y, "yo")
```

以下のようなデータが出力されます。

```
X = [[-1.51308726 -0.66429757  0.35133554 -0.48403143]
 [-1.78809425 -1.15436024 -2.21333348 -1.68175651]
 [-1.08851741 -0.29182345  0.73414765 -0.12549567]
 [-0.12022767  0.75314283 -1.53472134  0.00512708]
 [-0.08552138  0.33139302 -1.07281476  1.28944858]]
Y = [ -19.76575122 -227.36295209   38.25387403  -34.67388071  -31.76298106]
coef = [ 0.         88.25898063 63.26534186  0.        ]
```

プロットを表示してみると、赤と緑のプロットが相関のある特徴量となっています。

![dataset_linear1.png](https://qiita-image-store.s3.amazonaws.com/0/134550/6c2ad744-4529-b0b1-a539-3768fdb817dc.png)



# 分類データセット生成

## make_blobs
[sklearn.datasets.make_blobs](http://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_blobs.html) クラスを使用します。

#### 引数

|引数|内容|
|:-----------------|:------------------|
|n_samples|サンプル数|
|n_features|特徴量の数|
|centers|中心の個数（塊数）|
|cluster_std|クラスタの標準偏差|


#### データセット生成

特徴量の数を 2、塊数を3 に設定してデータセットを生成します。

```python
####################################
# ブロブデータ生成
####################################
from sklearn.datasets import make_blobs

X, Y = make_blobs(random_state=8,
                  n_samples=100, 
                  n_features=2, 
                  cluster_std=1.5,
                  centers=3)

print("X =", X[:3])
print("Y =", Y)

plt.figure(figsize=(8, 7))
plt.scatter(X[:, 0], X[:, 1], marker='o', c=Y, s=25, edgecolor='k')
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
```

以下のようなデータが出力されます。

```
X = [[ -6.71102744 -10.55634522]
 [ -5.23444824 -13.29219851]
 [ -7.25731608 -11.53143949]]
Y = [2 2 2 0 2 0 2 2 2 1 0 0 1 2 2 0 0 2 1 1 0 0 0 0 1 1 2 2 1 2 0 1 1 0 1 2 0
 2 1 1 2 1 0 1 0 1 0 0 2 0 0 2 1 0 2 2 0 1 0 1 1 2 1 0 2 1 0 0 0 1 0 1 0 0
 2 2 2 1 1 0 2 2 2 2 0 1 2 0 0 2 1 1 1 1 2 1 1 2 0 1]
```

塊が３つ表示されました。

![dataset_blob1.png](https://qiita-image-store.s3.amazonaws.com/0/134550/7b0132a6-6640-4638-e70a-56dac904f46a.png)



## make_classification
[sklearn.datasets.make_classification](http://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_classification.html) クラスを使用します。

#### 引数

|引数|内容|
|:-----------------|:------------------|
|n_samples|サンプル数|
|n_features|特徴量の数|
|n_informative|目的変数のラベルと相関が強い特徴量の数|
|n_clusters_per_class|1クラスのクラスタ数|
|n_classes|分類クラス数|

#### データセット生成（２クラス）

```python
from sklearn.datasets import make_classification

####################################
# ２クラス分類
####################################
X, Y = make_classification(random_state=12,
                           n_features=2, 
                           n_redundant=0, 
                           n_informative=1,
                           n_clusters_per_class=1,
                           n_classes=2)
print("X =", X[:3])
print("Y =", Y[:20])

plt.figure(figsize=(8, 7))
plt.title("make_classification : n_features=2  n_classes=2")
plt.scatter(X[:, 0], X[:, 1], marker='o', c=Y, s=25, edgecolor='k')
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
```

以下のようなデータが出力されます。

```
X = [[-1.38809422 -1.37759603]
 [-0.66625812 -0.48403143]
 [-1.07009269 -0.25080271]]
Y = [0 0 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 0]
```

![dataset_class2.png](https://qiita-image-store.s3.amazonaws.com/0/134550/ffc73116-dd65-8457-6748-e5f6afa1405f.png)


#### データセット生成（３クラス）

```python
####################################
# ３クラス分類
####################################
X, Y = make_classification(random_state=11,
                           n_features=2, 
                           n_redundant=0, 
                           n_informative=2,
                           n_clusters_per_class=1, 
                           n_classes=3)
print("X =", X[:3])
print("Y =", Y[:20])

plt.figure(figsize=(8, 7))
plt.title("make_classification : n_features=2  n_classes=3")
plt.scatter(X[:, 0], X[:, 1], marker='o', c=Y, s=25, edgecolor='k')
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
```

以下のようなデータが出力されます。
３クラス分類のデータになっています。

```
X = [[-0.76615642  0.09045822]
 [ 1.35779151  0.27391384]
 [-1.15957914  1.06208186]]
Y = [2 1 0 1 0 1 0 0 2 2 0 0 0 0 1 1 2 1 2 2]
```

![dataset_class3.png](https://qiita-image-store.s3.amazonaws.com/0/134550/5e120c04-18fa-bf83-3937-73de3535c8fa.png)


## make_gaussian_quantiles
[sklearn.datasets.make_gaussian_quantiles](http://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_gaussian_quantiles.html) クラスを使用します。

#### 引数

|引数|内容|
|:-----------------|:------------------|
|n_features|特徴量の数|
|n_classes|中心の個数（塊数）|


#### データセット生成

特徴量の数を 2、塊数を2 に設定してデータセットを生成します。

```python
from sklearn.datasets import make_gaussian_quantiles

X, Y = make_gaussian_quantiles(random_state=0,
                               n_features=2, 
                               n_classes=2)
print("X =", X[:3])
print("Y =", Y[:20])

plt.figure(figsize=(8, 7))
plt.title("make_gaussian_quantiles : n_features=2  n_classes=2")
plt.scatter(X[:, 0], X[:, 1], marker='o', c=Y, s=25, edgecolor='k')
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
```

以下のようなデータが出力されます。

```
X = [[-0.09845252 -0.66347829]
 [ 1.8831507  -1.34775906]
 [-0.90729836  0.0519454 ]]
Y = [0 1 0 1 1 0 0 1 0 0 1 0 1 1 1 0 1 1 1 1]
```

線形分離不可能なデータが出力されました。

![Screenshot from 2018-07-27 17-14-09.png](https://qiita-image-store.s3.amazonaws.com/0/134550/145f92eb-271c-7d2d-b7dd-f3ea8ea54df8.png)



以上、 scikit-learn の データセット生成を試してみました。