Pythonを一から勉強してデータ分析できるようになる

~ Pythonとデータ分析のお勉強の記録 ~

機械学習:機械学習のプログラムを作る~前回プログラムの練習

[Take1] 塊データ~テストデータの塊数を4にしてみる。

 

【書式】

X,y=make_blobs(
 random_state=0, # ランダムの種
 n_features=2, # 特徴量の数
 centers=4, # 塊の数
 cluster_std=1, # ばらつき
 n_samples=600 # データ数
)

 

【コード】

%matplotlib inline
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.datasets import make_blobs
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn.metrics import accuracy_score
 
# 「塊」のデータセット生成
X,y=make_blobs(
    random_state=0, # ランダムの種
    n_features=2, # 特徴量の数
    centers=4,  # 塊の数
    cluster_std=1,  # ばらつき
    n_samples=600 # データ数
)
 
# 学習用データとテスト用データに分ける
X_train, X_test, y_train, y_test=train_test_split(X, y, random_state=0)
 
# 学習モデルを作る
model=svm.SVC()
 
# 学習
model.fit(X_train, y_train)
 
# 予測:(-2,6)と(0,0)と(2,6)の3つの説明変数の分類を予測する
pred=model.predict([[-2,6],[0,0],[2,6]])
 
# 予測結果
print("(-2,6)の予測:",pred[0])
print("(0,0)の予測:",pred[1])
print("(2,6)の予測:",pred[2])

 

【結果】

(-2,6)の予測: 3
(0,0)の予測: 1
(2,6)の予測: 0

 

SVMの仕組みがよくわからないが、とりあえず結果は出た。

 

[Take1-1] [Take1]の結果を可視化する

予測結果の妥当性がめないので、可視化する。

教師データ散布図の中に予測データをプロットする

 

【書式】

plt.scatter([x座標],[y座標],color="色",marker="マーカタイプ",s=サイズ)

 

【コード】

%matplotlib inline
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.datasets import make_blobs
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn.metrics import accuracy_score
 
# 「塊」のデータセット生成
X,y=make_blobs(
    random_state=0, # ランダムの種
    n_features=2, # 特徴量の数
    centers=4,  # 塊の数
    cluster_std=1,  # ばらつき
    n_samples=600 # データ数
)
 
# 学習用データとテスト用データに分ける
X_train, X_test, y_train, y_test=train_test_split(X, y, random_state=0)
 
# 学習モデルを作る
model=svm.SVC()
 
# 学習
model.fit(X_train, y_train)
 
# 予測:(-2,6)と(0,0)と(2,6)の3つの説明変数の分類を予測する
pred=model.predict([[-2,6],[0,0],[2,6]])
 
# 予測結果
print("(-2,6)の予測:",pred[0])
print("(0,0)の予測:",pred[1])
print("(2,6)の予測:",pred[2])
 
# X_test でdfを作り、テストデータの分類と予測結果の分類の列を追加する
df=pd.DataFrame(X_test)
df["target"]=y_test
 
# targetの種類ごとに異なるデータフレームを作る
df0=df[df['target']==0]
df1=df[df['target']==1]
df2=df[df['target']==2]
df3=df[df['target']==3]
 
# 散布図を描画する
plt.scatter(df0[0],df0[1],color="b",alpha=0.5)
plt.scatter(df1[0],df1[1],color="r",alpha=0.5)
plt.scatter(df2[0],df2[1],color="g",alpha=0.5)
plt.scatter(df3[0],df3[1],color="m",alpha=0.5)
 
# 予測データを重ねる
plt.scatter([-2],[6],color="m",marker="x",s=300)
plt.scatter([0],[0],color="r",marker="x",s=300)
plt.scatter([2],[6],color="b",marker="x",s=300)
 
plt.title("predict")
plt.show()

 

【結果】

(-2,6)の予測: 3
(0,0)の予測: 1
(2,6)の予測: 0

 

概ね教師データ近辺と同じ判定となっていた。

 

[Take2] 三日月データで試してみる

 

【書式】

X,y=make_moons(
 random_state=500, # ランダムの種
 noise=0.1, # ノイズ
 n_samples=300 # データ数
)

 

【コード】

%matplotlib inline
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split
from sklearn import svm
import pandas as pd
 
# 特徴量 X、分類 y のデータ作成
X,y=make_moons(
    random_state=500, # ランダムの種
    noise=0.1, # ノイズ
    n_samples=300 # データ数
)
 
# 学習用データとテスト用データに分ける
X_train, X_test, y_train, y_test=train_test_split(X, y, random_state=0)
 
# 学習モデルを作る
model=svm.SVC()
 
# 学習
model.fit(X_train, y_train)
 
# 予測:(-1,1.25)と(0,0.5)と(2,3)の3つの説明変数の分類を予測する
pred=model.predict([[-1,1.25],[0,0.5],[2,3]])
 
# 予測結果
print("(-2,6)の予測:",pred[0])
print("(0,0)の予測:",pred[1])
print("(2,6)の予測:",pred[2])

 

【結果】

(-2,6)の予測: 0
(0,0)の予測: 1
(2,6)の予測: 0

 

結果の妥当性がよくわからないので、グラフ上にプロットしてみる。

 

[Take2-1] グラフに描いてみる

 

【書式】

 

【コード】

%matplotlib inline
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split
from sklearn import svm
import pandas as pd
 
# 特徴量 X、分類 y のデータ作成
X,y=make_moons(
    random_state=500, # ランダムの種
    noise=0.1, # ノイズ
    n_samples=300 # データ数
)
 
# 学習用データとテスト用データに分ける
X_train, X_test, y_train, y_test=train_test_split(X, y, random_state=0)
 
# 学習モデルを作る
model=svm.SVC()
 
# 学習
model.fit(X_train, y_train)
 
# 予測:(-1,1.25)と(0,0.5)と(2,3)の3つの説明変数の分類を予測する
pred=model.predict([[-1,1.25],[0,0.5],[2,3]])
 
# X_test でdfを作り、テストデータの分類と予測結果の分類の列を追加する
df=pd.DataFrame(X_test)
df["target"]=y_test
 
# 分類ごとにデータフレームを分ける
df0=df[df["target"]==0]
df1=df[df["target"]==1]
 
# グラフの描画
plt.figsize=(5,5)
plt.scatter(df0[0],df0[1],color="b",alpha=0.5)
plt.scatter(df1[0],df1[1],color="g",alpha=0.5)
 
# 予測データを重ねる
plt.scatter([-1],[1.25],color="b",marker="x",s=300)
plt.scatter([0],[0.5],color="g",marker="x",s=300)
plt.scatter([2],[3],color="b",marker="x",s=300)
 
plt.show()

 

【結果】

 

教師データ近辺はそれらしいが、離れた点はどうとでも言えそう。

 

[Take2-3] 違う切り口でテストデータを作ってその結果を可視化する

 

【書式】

 

【コード】

%matplotlib inline
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split
from sklearn import svm
import pandas as pd
 
# 特徴量 X、分類 y のデータ作成
X,y=make_moons(
    random_state=500, # ランダムの種
    noise=0.1, # ノイズ
    n_samples=300 # データ数
)
 
# 学習用データとテスト用データに分ける
X_train, X_test, y_train, y_test=train_test_split(X, y, random_state=0)
 
# 学習モデルを作る
model=svm.SVC()
 
# 学習
model.fit(X_train, y_train)
 
# 予測:(x,y)=(0.5,-0.5),(0.5,0.0),(0.5,0.5),(0.5,1.0),(0.5,1.5)の分類を予測する
pred=model.predict([[0.5,-0.5],[0.5,0],[0.5,0.5],[0.5,1],[0.5,1.5]])
 
# 予測結果
print("(0.5,-0.5)の予測:",pred[0])
print("(0.5,0)の予測:",pred[1])
print("(0.5,0.5)の予測:",pred[2])
print("(0.5,1)の予測:",pred[3])
print("(0.5,1.5)の予測:",pred[4])
 
# X_test でdfを作り、テストデータの分類と予測結果の分類の列を追加する
df=pd.DataFrame(X_test)
df["target"]=y_test
 
# 分類ごとにデータフレームを分ける
df0=df[df["target"]==0]
df1=df[df["target"]==1]
 
# グラフの描画
plt.figsize=(5,5)
plt.scatter(df0[0],df0[1],color="b",alpha=0.5)
plt.scatter(df1[0],df1[1],color="g",alpha=0.5)
 
# 予測データを重ねる
# 分類の色は、予測結果を見たうえで設定した
plt.scatter([0.5],[-0.5],color="g",marker="x",s=300)
plt.scatter([0.5],[0.0],color="g",marker="x",s=300)
plt.scatter([0.5],[0.5],color="b",marker="x",s=300)
plt.scatter([0.5],[1.0],color="b",marker="x",s=300)
plt.scatter([0.5],[1.5],color="b",marker="x",s=300)
 
plt.show()

 

【結果】

(0.5,-0.5)の予測: 1
(0.5,0)の予測: 1
(0.5,0.5)の予測: 0
(0.5,1)の予測: 0
(0.5,1.5)の予測: 0

 

塊の周辺はそれらしく見える。

 

[Take2-4] 塊から離れた点の予測結果を眺める

今度は、緑の塊の右端を通る直線(x=2)で予測し、その結果を可視してみる

 

【書式】

 

【コード】

%matplotlib inline
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split
from sklearn import svm
import pandas as pd
 
# 特徴量 X、分類 y のデータ作成
X,y=make_moons(
    random_state=500, # ランダムの種
    noise=0.1, # ノイズ
    n_samples=300 # データ数
)
 
# 学習用データとテスト用データに分ける
X_train, X_test, y_train, y_test=train_test_split(X, y, random_state=0)
 
# 学習モデルを作る
model=svm.SVC()
 
# 学習
model.fit(X_train, y_train)
 
# 予測1:(x,y)=(0.5,-2.0),(0.5,-1.0),(0.5,0.0),(0.5,1.0),(0.5,2.0)の分類を予測する
pred=model.predict([[0.5,-2.0],[0.5,1.0],[0.5,0.0],[0.5,1.0],[0.5,2.0]])
 
# 予測2:(x,y)=(2.0,-2.0),(2.0,-1.0),(2.0,0.0),(2.0,1.0),(2.0,2.0)の分類を予測する
pred2=model.predict([[2.0,-2.0],[2.0,1.0],[2.0,0.0],[2.0,1.0],[2.0,2.0]])
 
# 予測結果
print("(0.5,-2.0)の予測:",pred[0])
print("(0.5,-1.0)の予測:",pred[1])
print("(0.5,0.0)の予測:",pred[2])
print("(0.5,1.0)の予測:",pred[3])
print("(0.5,2.0)の予測:",pred[4])
 
print("(2.0,-2.0)の予測:",pred2[0])
print("(2.0,-1.0)の予測:",pred2[1])
print("(2.0,0.0)の予測:",pred2[2])
print("(2.0,1.0)の予測:",pred2[3])
print("(2.0,2.0)の予測:",pred2[4])
 
# X_test でdfを作り、テストデータの分類と予測結果の分類の列を追加する
df=pd.DataFrame(X_test)
df["target"]=y_test
 
# 分類ごとにデータフレームを分ける
df0=df[df["target"]==0]
df1=df[df["target"]==1]
 
# グラフの描画
plt.figsize=(5,5)
plt.scatter(df0[0],df0[1],color="b",alpha=0.5)
plt.scatter(df1[0],df1[1],color="g",alpha=0.5)
 
# 予測データを重ねる
# 分類の色は、予測結果を見たうえで設定した
plt.scatter([0.5],[-2.0],color="g",marker="x",s=300)
plt.scatter([0.5],[-1.0],color="b",marker="x",s=300)
plt.scatter([0.5],[0.0],color="g",marker="x",s=300)
plt.scatter([0.5],[1.0],color="b",marker="x",s=300)
plt.scatter([0.5],[2.0],color="b",marker="x",s=300)
 
plt.scatter([2.0],[-2.0],color="g",marker="x",s=300)
plt.scatter([2.0],[-1.0],color="g",marker="x",s=300)
plt.scatter([2.0],[0.0],color="g",marker="x",s=300)
plt.scatter([2.0],[1.0],color="g",marker="x",s=300)
plt.scatter([2.0],[2.0],color="g",marker="x",s=300)
 
plt.show()

 

【結果】

(0.5,-2.0)の予測: 1
(0.5,-1.0)の予測: 0
(0.5,0.0)の予測: 1
(0.5,1.0)の予測: 0
(0.5,2.0)の予測: 0
(2.0,-2.0)の予測: 1
(2.0,-1.0)の予測: 1
(2.0,0.0)の予測: 1
(2.0,1.0)の予測: 1
(2.0,2.0)の予測: 1

 

微妙な結果だが流す。

機械学習:機械学習のプログラムを作る

流れ

[Take1] 学習用のデータを作成する

[Take2] データを学習用とテスト用に分ける

[Take3] SVMサポートベクターマシン)を使って学習する

[Take4] 学習結果を使ってテストデータの分類を予測する

[Take5] 正答率を調べる(そういう機能の関数がある)

[Take6] 任意のデータを渡して予測する

それでは、順番に進めていくこととする。

 

 

[Take1] 学習用のデータを作成する

 

【書式】

書式:「塊」のデータセット生成
X,y=make_blobs

 

【コード】

%matplotlib inline
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
import pandas as pd
 
# 「塊」のデータセット生成
X,y=make_blobs(
    random_state=0, # ランダムの種
    n_features=2, # 特徴量の数
    centers=2,  # 塊の数
    cluster_std=1,  # ばらつき
    n_samples=300 # データ数
)
 
# X(特徴量)でデータフレームを作る
df=pd.DataFrame(X)
 
# y(悦明変数)を「target」の列名でデータフレームに追加
df["target"]=y
 
# カラム名を変更する
df= df.rename(columns={0: 'col_0',1: 'col_1'})
 
# targetの種類ごとに異なるデータフレームを作る
df0=df[df['target']==0]
df1=df[df['target']==1]
 
# 散布図を描画する
plt.scatter(df0["col_0"],df0["col_1"],color="b",alpha=0.5)
plt.scatter(df1["col_0"],df1["col_1"],color="r",alpha=0.5)
 
plt.xlabel("col_0")
plt.ylabel("col_1")
plt.title("All")
plt.show()
 
# 検証用にcsvに出力しておく(事前にGドライブのマウントが必要)
df.to_csv("/content/drive/MyDrive/Python_2024/003/gakushu.csv")

 

【結果】

 

 

[Take2] データを学習用とテスト用に分ける

 

【書式】

X_train, X_test, y_train, y_test=train_test_split(X, y, random_state=0)
X:説明変数(配列が格納された配列)
y:目的変数(数値が格納された配列)
分割割合は test_size, オプションで指定する。デフォルトは 25%。
 

 

【コード】

%matplotlib inline
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.model_selection import train_test_split
import pandas as pd
 
# 「塊」のデータセット生成
X,y=make_blobs(
    random_state=0, # ランダムの種
    n_features=2, # 特徴量の数
    centers=2,  # 塊の数
    cluster_std=1,  # ばらつき
    n_samples=300 # データ数
)
 
# 学習用データとテスト用データに分ける
X_train, X_test, y_train, y_test=train_test_split(X, y, random_state=0, test_size=0.25)
 
# X(学習データ)でデータフレームを作る
df=pd.DataFrame(X_train)
df["target"]=y_train
 
# targetの種類ごとに異なるデータフレームを作る
df0=df[df['target']==0]
df1=df[df['target']==1]
 
# 散布図を描画する
plt.scatter(df0[0],df0[1],color="b",alpha=0.5)
plt.scatter(df1[0],df1[1],color="r",alpha=0.5)
 
plt.title("train:75%")
plt.show()
 
# X(テストデータ)でデータフレームを作る
df=pd.DataFrame(X_test)
df["target"]=y_test
 
# targetの種類ごとに異なるデータフレームを作る
df0=df[df['target']==0]
df1=df[df['target']==1]
 
# 散布図を描画する
plt.scatter(df0[0],df0[1],color="b",alpha=0.5)
plt.scatter(df1[0],df1[1],color="r",alpha=0.5)
 
plt.title("test:25%")
plt.show()

 

【結果】



 

 

[Take3] SVMサポートベクターマシン)を使って学習する

 

【書式】

model=svm.SVC()
model.fit(X_train, y_train)

 

【コード】

from sklearn.datasets import make_blobs
from sklearn.model_selection import train_test_split
from sklearn import svm
 
# 「塊」のデータセット生成
X,y=make_blobs(
    random_state=0, # ランダムの種
    n_features=2, # 特徴量の数
    centers=2,  # 塊の数
    cluster_std=1,  # ばらつき
    n_samples=300 # データ数
)
 
# 学習用データとテスト用データに分ける
X_train, X_test, y_train, y_test=train_test_split(X, y, random_state=0, test_size=0.25)
 
# 学習モデルを作る★
model=svm.SVC()
 
# 学習★
model.fit(X_train, y_train)
 
# 以下は参考項目
print(type(model))
print(model)

 

【結果】

<class 'sklearn.svm._classes.SVC'>
SVC()

 

 

[Take4] 学習結果を使ってテストデータの分類を予測する

 

【書式】

pred=model.predict(X_test)

 

【コード】

%matplotlib inline
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.datasets import make_blobs
from sklearn.model_selection import train_test_split
from sklearn import svm
 
# 「塊」のデータセット生成
X,y=make_blobs(
    random_state=0, # ランダムの種
    n_features=2, # 特徴量の数
    centers=2,  # 塊の数
    cluster_std=1,  # ばらつき
    n_samples=300 # データ数
)
 
# 学習用データとテスト用データに分ける
X_train, X_test, y_train, y_test=train_test_split(X, y, random_state=0)
 
# 学習モデルを作る
model=svm.SVC()
 
# 学習
model.fit(X_train, y_train)
 
# 予測
pred=model.predict(X_test)
 
# X_test でdfを作り、予測結果の列を追加する
df=pd.DataFrame(X_test)
df["pred"]=pred
 
# targetの種類ごとに異なるデータフレームを作る
df0=df[df['pred']==0]
df1=df[df['pred']==1]
 
# 散布図を描画する
plt.scatter(df0[0],df0[1],color="b",alpha=0.5)
plt.scatter(df1[0],df1[1],color="r",alpha=0.5)
 
plt.title("predict")
plt.show()

 

【結果】

 

グラフを見る限り、それらしい分類を割り付けることができている。

 

[Take4-1] テストデータの分布と、予測結果の分布を対比してみる

 

【書式】

 

【コード】

import pandas as pd
from sklearn.datasets import make_blobs
from sklearn.model_selection import train_test_split
from sklearn import svm
 
# 「塊」のデータセット生成
X,y=make_blobs(
    random_state=0, # ランダムの種
    n_features=2, # 特徴量の数
    centers=2,  # 塊の数
    cluster_std=1,  # ばらつき
    n_samples=300 # データ数
)
 
# 学習用データとテスト用データに分ける
X_train, X_test, y_train, y_test=train_test_split(X, y, random_state=0)
 
# 学習モデルを作る
model=svm.SVC()
 
# 学習
model.fit(X_train, y_train)
 
# 予測
pred=model.predict(X_test)
 
# X_test でdfを作り、テストデータの分類と予測結果の分類の列を追加する
df=pd.DataFrame(X_test)
df["target"]=y_test
df["pred"]=pred
 
# targetの種類ごとに異なるデータフレームを作る
df0=df[df['target']==0]
df1=df[df['target']==1]
 
# 散布図を描画する
plt.scatter(df0[0],df0[1],color="b",alpha=0.5)
plt.scatter(df1[0],df1[1],color="r",alpha=0.5)
 
plt.title("target")
plt.show()
 
# predictの種類ごとに異なるデータフレームを作る
df0=df[df['pred']==0]
df1=df[df['pred']==1]
 
# 散布図を描画する
plt.scatter(df0[0],df0[1],color="b",alpha=0.5)
plt.scatter(df1[0],df1[1],color="r",alpha=0.5)
 
plt.title("predict")
plt.show()
 
# 参考用にdfを出力しておく
print(df.head())

 

【結果】



 
0 1 target pred
0 0.163124 2.577505 0 0
1 0.465465 3.123155 0 0
2 2.093898 -0.759051 1 1
3 1.456614 -0.218233 1 1
4 1.616078 1.079002 1 1

 

ちょうど各塊の境界付近に、予測間違いが見受けられる。

CSVデータで明細を見ると、3か所存在する(合計75個なので、4%→正答率96%ということか・・・)

 

[Take5] 正答率を調べる(そういう機能の関数がある)

 

【書式】

accuracy_score(y_test, pred)

 

【コード】

from sklearn.datasets import make_blobs
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn.metrics import accuracy_score
 
# 「塊」のデータセット生成
X,y=make_blobs(
    random_state=0, # ランダムの種
    n_features=2, # 特徴量の数
    centers=2,  # 塊の数
    cluster_std=1,  # ばらつき
    n_samples=300 # データ数
)
 
# 学習用データとテスト用データに分ける
X_train, X_test, y_train, y_test=train_test_split(X, y, random_state=0)
 
# 学習モデルを作る
model=svm.SVC()
 
# 学習
model.fit(X_train, y_train)
 
# 予測
pred=model.predict(X_test)
 
# 正答率
score=accuracy_score(y_test, pred)
print(score)

 

【結果】

0.96

 

前回(Take4-1)で明細ベースでカウントした正答率と同じ結果が出てきた。

 

[Take6] 任意のデータを渡して予測する

 

【書式】

model.predict(任意のデータ)
任意のデータは、説明変数の型と合わせる必要があると思われる

 

【コード】

from sklearn.datasets import make_blobs
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn.metrics import accuracy_score
 
# 「塊」のデータセット生成
X,y=make_blobs(
    random_state=0, # ランダムの種
    n_features=2, # 特徴量の数
    centers=2,  # 塊の数
    cluster_std=1,  # ばらつき
    n_samples=300 # データ数
)
 
# 学習用データとテスト用データに分ける
X_train, X_test, y_train, y_test=train_test_split(X, y, random_state=0)
 
# 学習モデルを作る
model=svm.SVC()
 
# 学習
model.fit(X_train, y_train)
 
# 予測:(1,2)と(1,4)と(2,0)の3つの説明変数の分類を予測する
pred=model.predict([[1,2],[1,4],[2,0]])
 
# 予測結果を出力する
print("(1,2)の予測:",pred[0])
print("(1,4)の予測:",pred[1])
print("(2,0)の予測:",pred[2])

 

【結果】

(1,2)の予測: 1
(1,4)の予測: 0
(2,0)の予測: 1

 

 

[Take6-1] 学習データを予測結果をグラフ上で重ねてみる

 

【書式】

書式:散布図のオプション
plt.scatter(
  [x座標],
  [y座標],
  color="色",
  marker="マーカーの種類",
  s=マーカーのサイズ
)

 

【コード】

%matplotlib inline
import matplotlib.pyplot as plt
import pandas as pd
 
# 「塊」のデータセット生成
X,y=make_blobs(
    random_state=0, # ランダムの種
    n_features=2, # 特徴量の数
    centers=2,  # 塊の数
    cluster_std=1,  # ばらつき
    n_samples=300 # データ数
)
 
# 学習用データとテスト用データに分ける
X_train, X_test, y_train, y_test=train_test_split(X, y, random_state=0)
 
# 学習モデルを作る
model=svm.SVC()
 
# X_test でdfを作り、テストデータの分類と予測結果の分類の列を追加する
df=pd.DataFrame(X_test)
df["target"]=y_test
 
# targetの種類ごとに異なるデータフレームを作る
df0=df[df['target']==0]
df1=df[df['target']==1]
 
# 散布図を描画する
plt.scatter(df0[0],df0[1],color="b",alpha=0.5)
plt.scatter(df1[0],df1[1],color="r",alpha=0.5)
 
# 予測データを重ねる
# (1,2) は分類1なので赤でプロット
# (1,4) は分類0なので青でプロット
# (2,0) は分類0なので赤でプロット
plt.scatter([1],[2],color="r",marker="x",s=300)
plt.scatter([1],[4],color="b",marker="x",s=300)
plt.scatter([2],[0],color="r",marker="x",s=300)
 
plt.title("predict")
plt.show()

 

【結果】

 

分類「1」はグラフで言うところの赤い点。分類「0」は青の点。

(1,2)はおよそ境界上にあり、予測結果は「1(赤)」。

(1,4)は明らかに青の領域で、予測結果は「0(青)」。

(2,0)は明らかに赤の領域で、予測結果は「1(赤)」。

 

機械学習:回帰用データを作成する

[Take1] まずはノイズオプションをゼロにして作ってみる

 

【書式】

書式:回帰データの生成
make_regression(ランダムの種, 特徴量, ノイズ, y切片, データ個数)
書式:列の追加
df["列名"]=y

 

【コード】

%matplotlib inline
import matplotlib.pyplot as plt
from sklearn.datasets import make_regression
import pandas as pd
 
# 特徴量 X、分類 y のデータ作成
X,y=make_regression(
    random_state=3, # ランダムの種
    n_features=1, # 特徴量
    noise=0, # ノイズ
    bias=100, # y切片
    n_samples=300 # データ数
)
 
# 特徴量 X、分類 y のデータフレームを作成
df=pd.DataFrame(X)
# yをdfの「target」列に追加する
df["target"]=y
 
# グラフの描画
plt.figsize=(5,5)
plt.scatter(df[0],df["target"],color="b",alpha=0.5)
plt.show()
 
 
# 以下参考
# dfをcsvに書き出す(エクセル分析ツールにかける)
df.to_csv("/content/drive/MyDrive/Python_2024/003/n-0_r-3.csv")
print(df.head())
print(df.shape)
print(y.shape)

 

【結果】

 
0 target
0 -1.744110 49.083983
1 -1.244123 63.680160
2 -0.140620 95.894863
3 1.729417 150.487088
4 0.425967 112.435298
(300, 2)
(300,)

 

基準は、(x,y)=(0,100)を通る直線ということだと思われる。

Excelの回帰分析ツールにかけた結果を貼っておく

結局、y=29.2x+100 という直線データになりそう。

 

[Take1-1] 特徴量と y のデータ型等調べてみる

 

【書式】

 

【コード】

from sklearn.datasets import make_regression
import pandas as pd
 
# 特徴量 X、 y のデータ作成
X,y=make_regression(
    random_state=3, # ランダムの種
    n_features=1, # 特徴量
    noise=10, # ノイズ
    bias=100, # y切片
    n_samples=30 # データ数(わかりやすくするために減らす)
)
 
# 特徴量 X、分類 y のデータフレームを作成
df=pd.DataFrame(X)
 
# 各データの型と形式を羅列する
print("Xの内容")
print(X)
print("\n")
print("yの内容")
print(y)
print("\n")
print("Xのデータ型: ",type(X))
print("Xのサイズ: ",X.shape)
print("\n")
print("yのデータ型: ",type(y))
print("yのサイズ: ",y.shape)
print("\n")
print("dfのデータ型: ",type(df))
print("dfのサイズ: ",df.shape)

 

【結果】

Xの内容
[[-0.40467741]
[ 1.70957306]
[-0.35475898]
[ 1.78862847]
[ 0.62524497]
[-0.08274148]
[-0.47721803]
[-0.7129932 ]
[-1.10106763]
[-1.54647732]
[-1.8634927 ]
[ 0.43650985]
[ 0.05003364]
[-0.62700068]
[ 0.09649747]
[-0.04381817]
[-0.2056499 ]
[ 0.98236743]
[-0.16051336]
[-0.2773882 ]
[ 0.88131804]
[ 1.48614836]
[-0.54535995]
[-1.31386475]
[-1.18504653]
[ 0.88462238]
[-0.23003072]
[-1.02378514]
[-0.76883635]
[ 0.23671627]]
 
 
yの内容
[ 59.23041008 209.51540911 74.48741923 196.6240151 122.64247591
90.90871473 79.45754396 66.09517423 18.82827412 -9.78062739
-35.72030042 136.98156109 103.94263972 40.89943117 101.5597172
99.68222847 97.41828583 178.09277067 97.12241835 64.54730783
143.36925447 187.24737037 64.01834033 4.25452278 30.97495863
148.15167995 84.09686667 21.02405319 42.78785649 130.22336094]
 
 
Xのデータ型: <class 'numpy.ndarray'>
Xのサイズ: (30, 1)
 
 
yのデータ型: <class 'numpy.ndarray'>
yのサイズ: (30,)
 
 
dfのデータ型: <class 'pandas.core.frame.DataFrame'>
dfのサイズ: (30, 1)

 

 

[Take2] ノイズパラメータを変更した場合「noise=10」

 

【書式】

 

【コード】

%matplotlib inline
import matplotlib.pyplot as plt
from sklearn.datasets import make_regression
import pandas as pd
 
# 特徴量 X、分類 y のデータ作成
X,y=make_regression(
    random_state=3, # ランダムの種
    n_features=1, # 特徴量
    noise=10, # ノイズ★
    bias=100, # y切片
    n_samples=300 # データ数
)
 
# 特徴量 X、分類 y のデータフレームを作成
df=pd.DataFrame(X)
# yをdfの「target」列に追加する
df["target"]=y
 
# グラフの描画
plt.figsize=(5,5)
plt.scatter(df[0],df["target"],color="b",alpha=0.5)
plt.show()
 
# dfをcsvに書き出す(エクセル分析ツールにかける)
df.to_csv("/content/drive/MyDrive/Python_2024/003/n-10_r-3.csv")

 

【結果】

 

なんとなく予想通り(ばらつきが広がる)のかたちになった。

Excelの回帰分析ツールにかけた結果を貼っておく

切片と傾きはおおむね同じ。

 

[Take3] ランダムパラメータを変更した場合「random_state=6」

 

【書式】

 

【コード】

%matplotlib inline
import matplotlib.pyplot as plt
from sklearn.datasets import make_regression
import pandas as pd
 
# 特徴量 X、分類 y のデータ作成
X,y=make_regression(
    random_state=6, # ランダムの種★
    n_features=1, # 特徴量
    noise=0, # ノイズ
    bias=100, # y切片
    n_samples=300 # データ数
)
 
# 特徴量 X、分類 y のデータフレームを作成
df=pd.DataFrame(X)
# yをdfの「target」列に追加する
df["target"]=y
 
# グラフの描画
plt.figsize=(5,5)
plt.scatter(df[0],df["target"],color="b",alpha=0.5)
plt.show()
 
# dfをcsvに書き出す(エクセル分析ツールにかける)
df.to_csv("/content/drive/MyDrive/Python_2024/003/n-0_r-6.csv")

 

【結果】

 

Excelの回帰分析ツールにかけた結果を貼っておく

傾き6?これ以上の深入りはやめておく。

 

機械学習:同心円のデータを作る

 

[Take1] 3つのグループのデータを作る

 

【書式】

make_gaussian_quantiles()

 

【コード】

%matplotlib inline
import matplotlib.pyplot as plt
from sklearn.datasets import make_gaussian_quantiles
import pandas as pd
 
# 特徴量 X、分類 y のデータ作成
X,y=make_gaussian_quantiles(
    random_state=3, # ランダムの種
    n_features=2, # 特徴量
    n_classes=3, # 分類数
    n_samples=300 # データ数
)
 
# 特徴量 X、分類 y のデータフレームを作成
df=pd.DataFrame(X)
df["target"]=y
 
# 分類ごとにデータフレームを分ける
df0=df[df["target"]==0]
df1=df[df["target"]==1]
df2=df[df["target"]==2]
 
# グラフの描画
plt.figsize=(5,5)
plt.scatter(df0[0],df0[1],color="b",alpha=0.5)
plt.scatter(df1[0],df1[1],color="g",alpha=0.5)
plt.scatter(df2[0],df2[1],color="r",alpha=0.5)
plt.show()
 
# 以下参考~targetに格納されている値とその個数
print(df['target'].value_counts())
print("\n")
print(df.head())

 

【結果】

 
target
2 100
1 100
0 100
Name: count, dtype: int64
 
 
0 1 target
0 0.127295 2.193763 2
1 1.115945 -0.030303 1
2 -0.274600 0.435009 0
3 0.096497 -1.863493 2
4 -0.053948 1.315167 1

 

df の "target" に格納した分類(y)の値は、「0」が100個、「1」が100個、、「2」が100個

分類数3で、データ数が300なので、分類ごとに100個のデータが生成されたということらしい。

 

[Take2] 4つのグループのデータを作る

 

【書式】

make_gaussian_quantiles()

 

【コード】

%matplotlib inline
import matplotlib.pyplot as plt
from sklearn.datasets import make_gaussian_quantiles
import pandas as pd
 
# 特徴量 X、分類 y のデータ作成
X,y=make_gaussian_quantiles(
    random_state=3, # ランダムの種
    n_features=2, # 特徴量
    n_classes=4, # 分類数★(4つに増やす)
    n_samples=400 # データ数★(分類毎に100.計400)
)
 
# 特徴量 X、分類 y のデータフレームを作成
df=pd.DataFrame(X)
df["target"]=y
 
# 分類ごとにデータフレームを分ける
df0=df[df["target"]==0]
df1=df[df["target"]==1]
df2=df[df["target"]==2]
df3=df[df["target"]==3]
 
# グラフの描画
plt.figsize=(5,5)
plt.scatter(df0[0],df0[1],color="b",alpha=0.5)
plt.scatter(df1[0],df1[1],color="g",alpha=0.5)
plt.scatter(df2[0],df2[1],color="r",alpha=0.5)
plt.scatter(df3[0],df2[1],color="m",alpha=0.5)
plt.show()
 
# 以下参考~targetに格納されている値とその個数
print(df['target'].value_counts())
print("\n")
print(df.head())

 

【結果】

 
target
0 100
2 100
1 100
3 100
Name: count, dtype: int64
 
 
0 1 target
0 -0.349035 0.252825 0
1 -0.615109 -1.062156 2
2 -0.871432 -0.245548 1
3 1.038952 0.631744 2
4 -0.753335 -1.744110 3

 

もう、よくわからない絵になってしまった。

機械学習:二重円のデータを作成する

 

[Take1] noise=0 のデータを作成する

 

【書式】

make_circles()

 

【コード】

%matplotlib inline
import matplotlib.pyplot as plt
from sklearn.datasets import make_circles
import pandas as pd
 
# 特徴量 X、分類 y のデータ作成
X,y=make_circles(
    random_state=3, # ランダムの種
    noise=0, # ノイズ
    n_samples=300 # データ数
)
 
# 特徴量 X、分類 y のデータフレームを作成
df=pd.DataFrame(X)
df["target"]=y
 
# 分類ごとにデータフレームを分ける
df0=df[df["target"]==0]
df1=df[df["target"]==1]
 
# グラフの描画
plt.figsize=(5,5)
plt.scatter(df0[0],df0[1],color="b",alpha=0.5)
plt.scatter(df1[0],df1[1],color="g",alpha=0.5)
plt.show()
 
# 以下参考~targetに格納されている値とその個数
print(df['target'].value_counts())

 

【結果】

 
target
0 150
1 150
Name: count, dtype: int64

 

原点を中心とする、半径1と半径0.75の円を描いている感じ。

df の "target" に格納した分類(y)の値は、「0」が150個、「1」が150個

 

[Take2] ノイズオプションを変更してみる(noise=0.2)

 

【書式】

make_circles()

 

【コード】

%matplotlib inline
import matplotlib.pyplot as plt
from sklearn.datasets import make_circles
import pandas as pd
 
# 特徴量 X、分類 y のデータ作成
X,y=make_circles(
    random_state=3, # ランダムの種
    noise=0.2, # ノイズ
    n_samples=300 # データ数
)
 
# 特徴量 X、分類 y のデータフレームを作成
df=pd.DataFrame(X)
df["target"]=y
 
# 分類ごとにデータフレームを分ける
df0=df[df["target"]==0]
df1=df[df["target"]==1]
 
# グラフの描画
plt.figsize=(5,5)
plt.scatter(df0[0],df0[1],color="b",alpha=0.5)
plt.scatter(df1[0],df1[1],color="g",alpha=0.5)
plt.show()

 

【結果】

 

noise=0 と比べて各円がぼやける感じ。

機械学習:三日月型のデータを作成する

 

[Take1] とりあえず作成する

 

【書式】

make_moons()

 

【コード】

%matplotlib inline
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
import pandas as pd
 
# 特徴量 X、分類 y のデータ作成
X,y=make_moons(
    random_state=3, # ランダムの種
    noise=0.1, # ノイズ
    n_samples=300 # データ数(初期値=100)
)
 
# 特徴量 X、分類 y のデータフレームを作成
df=pd.DataFrame(X)
df["target"]=y
 
# 分類ごとにデータフレームを分ける
df0=df[df["target"]==0]
df1=df[df["target"]==1]
 
# グラフの描画
plt.figsize=(5,5)
plt.scatter(df0[0],df0[1],color="b",alpha=0.5)
plt.scatter(df1[0],df1[1],color="g",alpha=0.5)
plt.show()
 
# 以下参考~targetに格納されている値とその個数
print(df['target'].value_counts())

 

【結果】

target
0 150
1 150
Name: count, dtype: int64

 

 

[Take2] noiseパラメータを変えてみる(0にする)

 

【書式】

make_moons()

 

【コード】

%matplotlib inline
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
import pandas as pd
 
# 特徴量 X、分類 y のデータ作成
X,y=make_moons(
    random_state=3, # ランダムの種
    noise=0, # ノイズ★
    n_samples=300 # データ数
)
 
# 特徴量 X、分類 y のデータフレームを作成
df=pd.DataFrame(X)
df["target"]=y
 
# 分類ごとにデータフレームを分ける
df0=df[df["target"]==0]
df1=df[df["target"]==1]
 
# グラフの描画
plt.figsize=(5,5)
plt.scatter(df0[0],df0[1],color="b",alpha=0.5)
plt.scatter(df1[0],df1[1],color="g",alpha=0.5)
plt.show()

 

【結果】

 

 

[Take3] 生成したデータの情報を調べてみる

 

【書式】

 

【コード】

from sklearn.datasets import make_moons
import pandas as pd
 
# 特徴量 X、分類 y のデータ作成
X,y=make_moons(
    random_state=3, # ランダムの種
    noise=0.1, # ノイズ
    n_samples=10 # データ数(わかりやすく10に減らす)
)
 
# 各データの型と形式を羅列する
print("Xの内容")
print(X)
print("yの内容")
print(y)
print("Xのデータ型",type(X))
print("Xのサイズ",X.shape)
print("yのデータ型",type(y))
print("yのサイズ",y.shape)

 

【結果】

Xの内容
[[-0.04600421 0.49420792]
[-0.79224259 -0.06013125]
[ 0.80103042 0.58906592]
[-0.03473302 1.00662987]
[ 1.83724147 0.53978859]
[ 0.12997748 -0.27100033]
[ 0.94391901 -0.31810174]
[ 1.01565726 -0.12032762]
[-0.77751272 0.80902883]
[ 1.65364377 -0.33979568]]
yの内容
[1 0 0 0 1 1 1 0 0 1]
Xのデータ型 <class 'numpy.ndarray'>
Xのサイズ (10, 2)
yのデータ型 <class 'numpy.ndarray'>
yのサイズ (10,)

 

機械学習:塊のデータセットの生成

種類別のコード

 

[Take1] 「塊」のデータセットを作る

 

【書式】

書式:データ生成
特徴量,目的変数=make_blobs(パラメータ)
書式:カラム名変更
df= df.rename(columns={変更前: 変更後})
※複数ある時は、{}内を「,」でつなげる。

 

【コード】

from sklearn.datasets import make_blobs
import pandas as pd
 
# 「塊」のデータセット生成
X,y=make_blobs(
    random_state=3, # ランダムの種
    n_features=2, # 特徴量の数
    centers=2,  # 塊の数
    cluster_std=1,  # ばらつき
    n_samples=300 # データ数
)
 
# 作ったデータセットの情報を表示
print("type(X):",type(X))
print("X.shape:",X.shape)
print("len(X):",len(X))
print("type(y):",type(y))
print("y.shape:",y.shape)
print("len(y):",len(y))
 
 
# X(特徴量)でデータフレームを作る
df=pd.DataFrame(X)
 
# y(悦明変数)を「target」の列名でデータフレームに追加
df["target"]=y
 
# dfを表示する(カラム名変更前)
print("\n")
print(df.head())
 
# カラム名を変更する(targetと同じ表記で紛らわしいので)
df= df.rename(columns={0: 'col_0',1: 'col_1'})
 
# dfを表示する(カラム名変更後)
print("\n")
print(df.head())

 

【結果】

type(X): <class 'numpy.ndarray'>
X.shape: (300, 2)
len(X): 300
type(y): <class 'numpy.ndarray'>
y.shape: (300,)
len(y): 300
 
 
0 1 target
0 -5.071794 -1.364393 1
1 -3.174364 -1.145104 1
2 0.818543 5.937601 0
3 -4.338424 -2.055692 1
4 -3.887373 -0.436586 1
 
 
col_0 col_1 target
0 -5.071794 -1.364393 1
1 -3.174364 -1.145104 1
2 0.818543 5.937601 0
3 -4.338424 -2.055692 1
4 -3.887373 -0.436586 1

 

 

[Take2] データセットの散布図を作る

 

【書式】

plt.scatter(横軸カラム名,縦軸カラム名,coloc="b",alpha=0.5)

 

【コード】

%matplotlib inline
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
import pandas as pd
 
# 「塊」のデータセット生成
X,y=make_blobs(
    random_state=3, # ランダムの種
    n_features=2, # 特徴量の数
    centers=2,  # 塊の数
    cluster_std=1,  # ばらつき
    n_samples=300 # データ数
)
 
# X(特徴量)でデータフレームを作る
df=pd.DataFrame(X)
 
# y(悦明変数)を「target」の列名でデータフレームに追加
df["target"]=y
 
# カラム名を変更する
df= df.rename(columns={0: 'col_0',1: 'col_1'})
 
# targetの種類ごとに異なるデータフレームを作る
df0=df[df['target']==0]
df1=df[df['target']==1]
 
# 散布図を描画する
plt.scatter(df0["col_0"],df0["col_1"],color="b",alpha=0.5)
plt.scatter(df1["col_0"],df1["col_1"],color="g",alpha=0.5)
plt.xlabel("col_0")
plt.ylabel("col_1")
plt.show()

 

【結果】

 

 

[Take3] 塊の数が5個の散布図を作る

 

【書式】

 

【コード】

%matplotlib inline
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
import pandas as pd
 
# 「塊」のデータセット生成
X,y=make_blobs(
    random_state=3, # ランダムの種
    n_features=2, # 特徴量の数
    centers=5,  # 塊の数
    cluster_std=1,  # ばらつき
    n_samples=300 # データ数
)
 
# X(特徴量)でデータフレームを作る
df=pd.DataFrame(X)
 
# y(悦明変数)を「target」の列名でデータフレームに追加
df["target"]=y
 
# カラム名を変更する
df= df.rename(columns={0: 'col_0',1: 'col_1'})
 
# targetの種類ごとに異なるデータフレームを作る
df0=df[df['target']==0]
df1=df[df['target']==1]
df2=df[df['target']==2]
df3=df[df['target']==3]
df4=df[df['target']==4]
 
# 散布図を描画する
plt.scatter(df0["col_0"],df0["col_1"],color="b",alpha=0.5)
plt.scatter(df1["col_0"],df1["col_1"],color="g",alpha=0.5)
plt.scatter(df2["col_0"],df2["col_1"],color="r",alpha=0.5)
plt.scatter(df3["col_0"],df3["col_1"],color="m",alpha=0.5)
plt.scatter(df4["col_0"],df4["col_1"],color="c",alpha=0.5)
 
plt.xlabel("col_0")
plt.ylabel("col_1")
plt.show()

 

【結果】

 

 

[Take3-1] 塊の数が5個で、random_state オプションを変えてみる(3→6)

random_state オプションをを変更すると、塊の分布が変わる。

 

【書式】

 

【コード】

%matplotlib inline
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
import pandas as pd
 
# 「塊」のデータセット生成
X,y=make_blobs(
    random_state=6, # ランダムの種★
    n_features=2, # 特徴量の数
    centers=5,  # 塊の数
    cluster_std=1,  # ばらつき
    n_samples=300 # データ数
)
 
# X(特徴量)でデータフレームを作る
df=pd.DataFrame(X)
 
# y(悦明変数)を「target」の列名でデータフレームに追加
df["target"]=y
 
# カラム名を変更する
df= df.rename(columns={0: 'col_0',1: 'col_1'})
 
# targetの種類ごとに異なるデータフレームを作る
df0=df[df['target']==0]
df1=df[df['target']==1]
df2=df[df['target']==2]
df3=df[df['target']==3]
df4=df[df['target']==4]
 
# 散布図を描画する
plt.scatter(df0["col_0"],df0["col_1"],color="b",alpha=0.5)
plt.scatter(df1["col_0"],df1["col_1"],color="g",alpha=0.5)
plt.scatter(df2["col_0"],df2["col_1"],color="r",alpha=0.5)
plt.scatter(df3["col_0"],df3["col_1"],color="m",alpha=0.5)
plt.scatter(df4["col_0"],df4["col_1"],color="c",alpha=0.5)
 
plt.xlabel("col_0")
plt.ylabel("col_1")
plt.show()

 

【結果】

 

 

[Take3-2] 塊の数が5個で cluster_std オプションを変えてみる(1→3)

cluster_std オプションを変更(大きく)すると、個々の塊がぼやける

 

【書式】

 

【コード】

%matplotlib inline
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
import pandas as pd
 
# 「塊」のデータセット生成
X,y=make_blobs(
    random_state=6, # ランダムの種
    n_features=2, # 特徴量の数
    centers=5,  # 塊の数
    cluster_std=3,  # ばらつき★
    n_samples=300 # データ数
)
 
# X(特徴量)でデータフレームを作る
df=pd.DataFrame(X)
 
# y(悦明変数)を「target」の列名でデータフレームに追加
df["target"]=y
 
# カラム名を変更する
df= df.rename(columns={0: 'col_0',1: 'col_1'})
 
# targetの種類ごとに異なるデータフレームを作る
df0=df[df['target']==0]
df1=df[df['target']==1]
df2=df[df['target']==2]
df3=df[df['target']==3]
df4=df[df['target']==4]
 
# 散布図を描画する
plt.scatter(df0["col_0"],df0["col_1"],color="b",alpha=0.5)
plt.scatter(df1["col_0"],df1["col_1"],color="g",alpha=0.5)
plt.scatter(df2["col_0"],df2["col_1"],color="r",alpha=0.5)
plt.scatter(df3["col_0"],df3["col_1"],color="m",alpha=0.5)
plt.scatter(df4["col_0"],df4["col_1"],color="c",alpha=0.5)
 
plt.xlabel("col_0")
plt.ylabel("col_1")
plt.show()

 

【結果】