◯こちらのサンプルコードは指導等にご自由にお使いください。
【サンプルコードの使い方】
◯サンプルコードを写す時はコピペをしないようにしましょう。
◯▶を押すと出力が表示されます。
◯Geminiボタンを押すとGemini(AI)による解説が表示されます。間違っていることもあるので、疑問に思った場合はご質問ください。
◯本マークを押すとカテゴリーの解説が見られます。
◯サンプルコードを写す時はコピペをしないようにしましょう。
◯▶を押すと出力が表示されます。
◯Geminiボタンを押すとGemini(AI)による解説が表示されます。間違っていることもあるので、疑問に思った場合はご質問ください。
◯本マークを押すとカテゴリーの解説が見られます。
【カテゴリーごとのページへ移動】
【Code List】
CODE: d-1 (scikit-learn)
from sklearn.decomposition import PCA import pandas as pd import matplotlib.pyplot as plt # ---- Config ---- CSV_FILE = "http://python.hisakatano.com/data/iris.csv" OUTPUT_FILE_1 = "d-1_output_1.png" OUTPUT_FILE_2 = "d-1_output_2.png" # --------------------------------------------------------- # PCAの次元圧縮結果のプロット # --------------------------------------------------------- def plot_pca_result(df, output_file): plt.clf() label_type = set(df["label"]) for t in label_type: df2 = df.query('label=="%s"' % (t)) plt.scatter(x=df2[0], y=df2[1], label=t) plt.legend() plt.grid() plt.xlabel("PC1") plt.ylabel("PC2") plt.savefig(output_file) return # --------------------------------------------------------- # メイン # --------------------------------------------------------- def main(): # ---- (1) data frameでのデータ取得 ---- df = pd.read_csv(CSV_FILE, index_col=None, header=0) print(df) # ---- (2) numpyに変換しデータ成形 ---- x = df.iloc[:, 0:4].to_numpy() # ---- (3) scikit-learnによる分析処理 ---- pca = PCA(n_components=2) pca.fit(x) x0 = pca.transform(x) # ---- 次元圧縮結果の可視化 ---- df2 = pd.DataFrame(x0) df2["label"] = df["species"] print(df2) plot_pca_result(df2, OUTPUT_FILE_1) # ---- 寄与度の可視化 ---- df3 = pd.DataFrame(pca.components_.T) df3["label"] = df.columns[0:4] print(df3) plot_pca_result(df3, OUTPUT_FILE_2) return(0) main()

◯pip install scikit-leranが必要。
◯「(1)data frameでのデータ取得 -> (2)numpyに変換しデータ成形 -> (3) scikit-learnによる分析処理」 が共通する一連の流れ。
◯numpyへの変換は必要ないときもあるが、本格的なデータ分析のときには必須の手順となるため慣れておこう。
◯参考: https://qiita.com/fsd-aki/items/65628ebe0973d88c16ef
◯出力ファイル1: https://python.hisakatano.com/data/d-1_output_1.png
◯出力ファイル2: https://python.hisakatano.com/data/d-1_output_2.png
◯irisデータについて: https://qiita.com/ao_log/items/fe9bd42fd249c2a7ee7a
◯PCA(主成分分析)とは?: https://www.srush.co.jp/blog/2462384781

CODE: d-2 (scikit-learn)
from sklearn.linear_model import LinearRegression import pandas as pd import matplotlib.pyplot as plt # ---- Config ---- CSV_FILE = "http://python.hisakatano.com/data/linear_regression_data.csv" OUTPUT_FILE = "d-2_output.png" # --------------------------------------------------------- # メイン処理 # --------------------------------------------------------- def main(): # ---- (1) data frameでのデータ取得 ---- df = pd.read_csv(CSV_FILE, index_col=None, header=0) print(df) # ---- (2) numpyに変換しデータ成形 ---- data_na = df.to_numpy() # ---- (3) scikit-learnによる分析処理 ---- lr = LinearRegression() x = data_na[:, 0] y = data_na[:, 1] x = x.reshape(len(x), 1) # xは行列にする。 # 今回は2次元データなのでNx1の行列。 print(x) print(y) lr.fit(x, y) coef = lr.coef_[0] # 傾き intercept = lr.intercept_ # 切片 print("傾き: %f" % (coef)) print("切片: %f" % (intercept)) plt.scatter(x, y, color="red") plt.plot(x, lr.predict(x), color="blue") plt.grid() plt.savefig(OUTPUT_FILE) return(0) main()

◯Linear regression(線形回帰)とは: 散布図にいい感じに直線を引く処理。
◯最小二乗法と言った方が伝わる人もいるかも。
◯lr.fit(x, y)のxは行列にする。本来多次元のデータも扱えるため、xは多次元でも可。今回は二次元なので、Nx1の行列とする。
◯参考: https://qiita.com/0NE_shoT_/items/08376b08783cd554b02e
◯出力ファイル: https://python.hisakatano.com/data/d-2_output.png

CODE: d-3 (scikit-learn)
from sklearn.model_selection import train_test_split from sklearn.neural_network import MLPClassifier from sklearn.preprocessing import LabelEncoder import pandas as pd import numpy as np import warnings # ---- Config ---- warnings.simplefilter("ignore") # 警告が表示されないようにする CSV_FILE = "http://python.hisakatano.com/data/iris.csv" # --------------------------------------------------------- # MLPの学習 # --------------------------------------------------------- def learn_mlp(x_arr, y_arr): print("Learning ... ") model = MLPClassifier(hidden_layer_sizes=(100,), max_iter=100, activation="relu", verbose=True) model.fit(x_arr, y_arr) print("Learning ... done") return(model) # --------------------------------------------------------- # メイン処理 # --------------------------------------------------------- def main(): # ---- (1) data frameでのデータ取得 ---- df = pd.read_csv(CSV_FILE, index_col=None, header=0) print(df) x_df = df.iloc[:, 0:4] y_df = df.iloc[:, 4] # ---- (2) numpy arrayに変換しデータ成形 ---- x_arr = x_df.to_numpy() y_arr = y_df.to_numpy() print(x_arr[0:5]) print(y_arr[0:5]) # ---- (3) scikit-learnによる分析処理 ---- # ラベルを数値に変換 ("setosa"->0, "versicolour"->1, "virginica"->2) le = LabelEncoder() y_arr = le.fit_transform(y_arr) print(y_arr[0:5]) # モデルの学習 model = learn_mlp(x_arr, y_arr) # スコアの確認 # 0.9以上であればだいたいOK score = model.score(x_arr, y_arr) print("Score: %.2f" % (score)) # モデルのテスト tmp_data = np.array([[7.4,2.8,6.1,1.9]]) # テストデータは行列(二次元配列)にする y = model.predict(tmp_data) for i in range(0, 4): print("%s: %f" % (df.columns[i], tmp_data[0][i])) print("の品種は") print(le.inverse_transform(y)[0]) # ラベルの数値を文字列に戻す return(0) main()

◯多層パーセプトロン(MLP, Multi-Layer Perceptron)とは、ニューラルネットワークの原始的なモデル。
◯今回は入力層が4ノード、中間層が100ノード、出力層が3ノードの3層MLP。
◯活性化関数はReLU。sigmoidなどでもOK。
◯簡単なモデルではあるが、この層が深くなると深層学習と呼ばれるモデルになる。今の生成AIなどで使われているモデルと原理は変わらない。
◯参考: https://qiita.com/maskot1977/items/d0253e1eab1ff1315dff
◯参考: https://qiita.com/nekotto/items/111bc5412ed0c000a9e6
