機械学習用データセット作成

Posted on 2020/11/25 in 機械学習 , Updated on: 2020/11/25

はじめに

scikit-learn を使って機械学習用のデータセットを簡単に作成できる。機械学習ライブラリを使った実験や、データの可視化の練習などに使用できる。

インポート

In [72]:
import numpy as np

# グラフ描画ライブラリ
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('darkgrid')
%matplotlib inline
cmap = plt.get_cmap("tab20")

回帰用データ (Regression)

回帰(Regression)用のデータは、sklearn.datasets.make_regression で作成可能。代表的な引数として以下。

引数 内容 default値
n_samples サンプル数 100
n_features 特徴量の数 100
n_informative 情報特徴量の数。つまり目的変数と相関が強い特徴量の数 10
n_targets 目的変数の数 1
bias バイアス項 0
noise 目的変数へくわえられるガウシアンノイズの標準偏差 0
coef Trueに設定で、線形モデルの係数を返す False

データセット作成

In [73]:
from sklearn.datasets import make_regression

X, y, coef = make_regression(n_samples=2000,  # サンプル数 2000
                             n_features=5,    # 特徴量数 5
                             n_informative=3, # 情報特徴量数 3 
                             bias=5.0,        # バイアス 5.0
                             noise=5.0,       # ガウシアンノイズ標準偏差 5.0
                             coef=True,
                             random_state=4)

print('X shape: ', X.shape)
print('y shape: ', y.shape)
X shape:  (2000, 5)
y shape:  (2000,)

サンプル数 2000個で、特徴量数 5個、それらのサンプルに対応するターゲットが 2000個作成された。
5つの特徴量の分布を可視化して確認。

In [74]:
plt.figure(figsize=(X.shape[1]*3, 3))

for i in range(X.shape[1]):
    plt.subplot(1, X.shape[1], i+1)
    plt.title('Figure {}'.format(i))
    plt.scatter(X[:, i], y, color=cmap(i), s=3)

plt.show()

可視化結果から、Figure 1, 3, 4 の 3つの特徴量が、目的変数 y に対して相関をもっていることがわかる。これが情報特徴量で指定した数である。各特徴量の係数 (coefficient) を確認すると、確かに Figure 0, 2 は、係数が 0 なので、目的変数と相関が無いことがわかる。

In [75]:
for i, co in enumerate(coef):
    print(f"Figure {i}'s coef :", co)
Figure 0's coef : 0.0
Figure 1's coef : 61.56167256526397
Figure 2's coef : 0.0
Figure 3's coef : 50.820502695026846
Figure 4's coef : 56.61958639204695

分類用データ (Classification)

回帰(Regression)用のデータは、sklearn.datasets.make_classification で作成可能。代表的な引数として以下。

引数 内容 default値
n_samples サンプル数 100
n_features 特徴量の数 20
n_redundant 冗長な特徴量の数 2
n_informative 情報特徴量の数。つまり目的変数と相関が強い特徴量の数 2
n_classes 分類するラベルの数。2なら2値分類問題 2
n_clusters_per_class ラベルごとのクラスターの数 2

データセット作成

In [110]:
from sklearn.datasets import make_classification

X, y = make_classification(n_samples=1000,         # サンプル数 1000
                           n_features=2,           # 特徴量数 2
                           n_redundant=0,          # 冗長特徴量数 0
                           n_informative=2,        # 情報特徴量数 2
                           n_clusters_per_class=1, # クラスター数 1
                           n_classes=2,            # 2クラス分類
                           random_state=8)

print("X shape :", X.shape)
print("y shape :", y.shape)
print("Class   : ", np.unique(y))
X shape : (1000, 2)
y shape : (1000,)
Class   :  [0 1]

サンプル数 1000個、特徴量数 2個、クラスが 0, 1 の 2クラス分類のデータセットが作成されたことがわかる。Fature 1, 2 の分布をクラスごとに色分けして可視化する。

In [111]:
plt.figure(figsize=(6,6))
plt.scatter(X[:, 0], X[:, 1], c=y+5, s=20, edgecolor='b')
plt.xlabel('Feature 1', fontsize=15)
plt.ylabel('Feature 2', fontsize=15)
plt.show()

多値分類

n_classes に任意の値を入れる。

In [116]:
from sklearn.datasets import make_classification

X, y = make_classification(n_samples=1000,         # サンプル数 1000
                           n_features=2,           # 特徴量数 2
                           n_redundant=0,          # 冗長特徴量数 0
                           n_informative=2,        # 情報特徴量数 2
                           n_clusters_per_class=1, # クラスター数 1
                           n_classes=3,            # 5クラス分類
                           random_state=8)

print("X shape :", X.shape)
print("y shape :", y.shape)
print("Class   : ", np.unique(y))
X shape : (1000, 2)
y shape : (1000,)
Class   :  [0 1 2]
In [117]:
plt.figure(figsize=(6,6))
plt.scatter(X[:, 0], X[:, 1], c=y+5, s=20, edgecolor='b')
plt.xlabel('Feature 1', fontsize=15)
plt.ylabel('Feature 2', fontsize=15)
plt.show()