Loading [MathJax]/extensions/tex2jax.js

[scikit-learn] 4. make_moonsによる三日月状データの生成

matplotlib

はじめに

sklearnのdatasets.make_moonsで三日月状の分布を示すクラスタリング、分類用のデータを作成することができる。ここでは各種パラメータが生成データに及ぼす影響について説明する。

解説

モジュールのインポートなど

import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
view raw make_moons.py hosted with ❤ by GitHub

バージョン

#version
import matplotlib
print(matplotlib.__version__)
3.3.3
import sklearn
print(sklearn.__version__)
0.24.0
view raw make_moons.py hosted with ❤ by GitHub

n_samples

#n_samples
X1,Y1 = make_moons(n_samples=10)
X2,Y2 = make_moons(n_samples=20)
X3,Y3 = make_moons(n_samples=50)
X4,Y4 = make_moons(n_samples=100)
fig, ax = plt.subplots(figsize=(5,5),nrows=2,ncols=2,dpi=140)
ax =ax.ravel()
ax[0].scatter(X1[:,0],X1[:,1],s=10,c=Y1,cmap="coolwarm")
ax[1].scatter(X2[:,0],X2[:,1],s=10,c=Y2,cmap="coolwarm")
ax[2].scatter(X3[:,0],X3[:,1],s=10,c=Y3,cmap="coolwarm")
ax[3].scatter(X4[:,0],X4[:,1],s=10,c=Y4,cmap="coolwarm")
ax[0].set_title("n_samples=10")
ax[1].set_title("n_samples=20")
ax[2].set_title("n_samples=50")
ax[3].set_title("n_samples=100")
[ax[i].axis("equal") for i in range(4)]
plt.tight_layout()
plt.savefig("n_samples.png",dpi=120)
plt.show()
view raw make_moons.py hosted with ❤ by GitHub

n_samplesを変化させることでサンプル数を変えることができる。

noise

#noise
X1,Y1 = make_moons(noise=None)
X2,Y2 = make_moons(noise=.1)
X3,Y3 = make_moons(noise=.2)
X4,Y4 = make_moons(noise=.3)
fig, ax = plt.subplots(figsize=(5,5),nrows=2,ncols=2,dpi=140)
ax =ax.ravel()
ax[0].scatter(X1[:,0],X1[:,1],s=10,c=Y1,cmap="coolwarm")
ax[1].scatter(X2[:,0],X2[:,1],s=10,c=Y2,cmap="coolwarm")
ax[2].scatter(X3[:,0],X3[:,1],s=10,c=Y3,cmap="coolwarm")
ax[3].scatter(X4[:,0],X4[:,1],s=10,c=Y4,cmap="coolwarm")
ax[0].set_title("noise=None")
ax[1].set_title("noise=0.1")
ax[2].set_title("noise=0.2")
ax[3].set_title("noise=0.3")
[ax[i].axis("equal") for i in range(4)]
plt.tight_layout()
plt.savefig("noise.png",dpi=120)
plt.show()
view raw make_moons.py hosted with ❤ by GitHub

noiseでばらつきを付与できる。

random_state

#random_state
X1,Y1 = make_moons(noise=.1,random_state=1)
X2,Y2 = make_moons(noise=.1,random_state=2)
X3,Y3 = make_moons(noise=.1,random_state=3)
X4,Y4 = make_moons(noise=.1,random_state=4)
fig, ax = plt.subplots(figsize=(5,5),nrows=2,ncols=2,dpi=140)#,sharex=True,sharey=True)
ax =ax.ravel()
ax[0].scatter(X1[:,0],X1[:,1],s=10,c=Y1,cmap="coolwarm")
ax[1].scatter(X2[:,0],X2[:,1],s=10,c=Y2,cmap="coolwarm")
ax[2].scatter(X3[:,0],X3[:,1],s=10,c=Y3,cmap="coolwarm")
ax[3].scatter(X4[:,0],X4[:,1],s=10,c=Y4,cmap="coolwarm")
ax[0].set_title("random_state=1")
ax[1].set_title("random_state=2")
ax[2].set_title("random_state=3")
ax[3].set_title("random_state=4")
[ax[i].axis("equal") for i in range(4)]
plt.tight_layout()
plt.savefig("random_state.png",dpi=120)
plt.show()
view raw make_moons.py hosted with ❤ by GitHub

random_stateを変えることで再現可能な乱数を生成することができる。

shuffle

#shuffle
X1,Y1 = make_moons(shuffle=True)
X2,Y2 = make_moons(shuffle=False)
Y1#shuffle=True
array([1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1,
1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1,
0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1,
0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1,
0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0])
Y2#shuffle=False
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
view raw make_moons.py hosted with ❤ by GitHub

shuffleをFalseとすることでラベルがソートされたデータを得ることができる。デフォルトはTrue.

コードをダウンロード(.pyファイル)

コードをダウンロード(.ipynbファイル)

参考

make_moons
Gallery examples: Classifier comparison Comparing different clustering algorithms on toy datasets Comparing different hi...

コメント