scikit-learnとnumpyでデータセットを自作する

<h2>前書き</h2>
巷には様々なデータセットが公開されておりますが、ちょっとした手法や視覚化の実験などでデータセットが必要になった時に、自分が欲しいデータセットが見つからなくて困る時があります。

そんな時のために自分で好きなようにデータセットを生成する方法を説明します。

<h2>scikit-learn make_classification</h2>
make_classificationを使うと特徴数、サンプル数、ラベル数などを指定して分類データセットを生成できます。

<a href="http://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_classification.html#sklearn.datasets.make_classification" target="_blank" rel="noopener">scikit-learn make_classification(公式サイト)</a>

<ul>
  <li>n_samples -&gt; サンプル数</li>
  <li>n_features -&gt; 特徴数</li>
  <li>n_classes -&gt; クラス(ラベル)数</li>
  <li>n_informative -&gt; 有益な特徴の数(ラベルの数値決定に使用される特徴の数)</li>
</ul>
**注意:**n_classesをn_informativeより小さく設定することはできません

```python
from sklearn.datasets import make_classification

data = make_classification(n_samples = 100,n_features = 5,n_informative=3,n_classes=3)
```

**data[0]**でデータにアクセスできます。

```python
data[0][0:5]
```

```python
array([[ 1.25171094, -0.30019005,  2.00806351, -1.47329273, -1.67471559],
       [ 0.31008017,  0.63222138,  1.23102902,  0.00867144, -1.32069461],
       [ 1.90703337, -3.09054185, -0.09613603, -1.76358775,  1.48529172],
       [-0.74437558, -0.36960086, -1.28849546, -1.52271631,  0.95437931],
       [ 0.07446709, -0.38235836, -0.43047044,  0.48153833,  0.63651724]])
```

**data[1]**でラベルにアクセスできます。

```python
data[1][0:5]
```

```python
array([0, 0, 0, 2, 1])
```

pandasのデータフレームに変換します。

```python
df = pd.DataFrame(data[0])
df['target'] = data[1]
df.head()
```


![スクリーンショット-2018-09-22-15.02.00.png](https://qiita-image-store.s3.amazonaws.com/0/239266/04b8c58c-1770-61b1-72da-f9c6005f7ca7.png)

<h2>scikit-learn make_regression</h2>
make_regressionを使うと特徴数、サンプル数などを指定して回帰データセットを生成できます。

<a href="http://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_regression.html#sklearn.datasets.make_regression" target="_blank" rel="noopener">scikit-learn make_regression(公式サイト)</a>

<ul>
  <li>n_samples -&gt; サンプル数</li>
  <li>n_features -&gt; 特徴数</li>
  <li>n_informative -&gt; 有益な特徴の数(ラベルの数値決定に使用される特徴の数)</li>
</ul>

**注意:**n_classesをn_informativeより小さく設定することはできません

```python
from sklearn.datasets import make_regression

data = make_regression(n_samples = 100,n_features = 5,n_informative=3)
```

pandasデータフレーム化します。

```python
df = pd.DataFrame(data[0])
df['target'] = data[1]
df.head()
```
![スクリーンショット-2018-09-22-15.28.34.png](https://qiita-image-store.s3.amazonaws.com/0/239266/43b0fc8d-7c53-8c4a-86dc-d0d3ad4bd05a.png)


<h2>numpyでデータセットを生成する</h2>
numpyでデータセットを生成すると、ターゲット変数の値と特徴の値に関連を持たせることができず、データセット全体の値がランダムになります。
<h2>numpy randn+randint</h2>

```python
import pandas as pd
import numpy as np

df = pd.DataFrame({'a': np.random.randn(100),
                   'b': np.random.randn(100),
                   'c': np.random.randn(100),
                 'target':np.random.randint(2, size=100)})
df.head()
```

![スクリーンショット-2018-09-22-15.35.49.png](https://qiita-image-store.s3.amazonaws.com/0/239266/289376ca-cf8e-68bb-3dd5-b26ee36e0d6b.png)


<ul>
  <li>np.random.randn(100) -&gt; ランダムな数値を100個生成します</li>
  <li>np.random.randint(2, size=100) -&gt; 0から1までの数値をランダムに100個生成します</li>
</ul>

すべてを**np.random.randn**で生成すれば回帰問題のためのデータセットを生成できます。

```python
df = pd.DataFrame({'a': np.random.randn(100),
                   'b': np.random.randn(100),
                   'c': np.random.randn(100),
                 'target':np.random.randn(100)})
df.head()
```

![スクリーンショット-2018-09-22-15.40.55.png](https://qiita-image-store.s3.amazonaws.com/0/239266/6de83d23-e281-21a2-b253-7e421b353581.png)


<a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.randint.html" target="_blank" rel="noopener">numpy.random.randint(公式サイト)</a>
<a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.randn.html" target="_blank" rel="noopener">numpy.random.randn(公式サイト)</a>