2.8K Views
January 22, 24
スライド概要
マテリアルズ・インフォマティクス連続セミナー
レポジトリ:https://bitbucket.org/kino_h/python_mi_seminar_2023rev2/src/main/
マテリアルズインフォマティクスチュートリアル
マテリアルズ・インフォマティクス 連続セミナー 次元圧縮・分類・クラスタリング 木野日織(きのひおり)
データ解析学手法の四過程(再) データから 知見を得る 1. データを 収集する 2. データを 加工する 3. データか ら学習する 4. 結果の解 釈を行う (階層構造の一例)
Scikit-learnの使い方 基本的な使い方が統一されています。 回帰・分類・クラスタリング X: (N,P) reg = LinearRegression(…) y: (N) reg.fit(X,y) yp: (N) yp =reg.predict(X) 規格化・次元圧縮 Xtransformed: (N,P) dr = PCA(…) dr.fit(X) Xtransformed =dr.transform(X) dr.fit_transform(X) としか呼べないモジュー ルもあります。
今回の内容 内容 次元圧縮 分類 クラスタ リング
次元圧縮 目的 説明変数はデータインスタンス数と特徴量数に応じたベクトルサイズを持ちます。 次元圧縮の「次元」は特徴量数のことで,元の特徴量の情報の意味を保ったまま低 特徴量数のベクトルに変換します。 意味:手法に依存する。 これにより • 理解しやすくなる。 • 可視化しやすくなる。 ことを期待する。 解析時に目的変数を設定しない教師なし学習。
ディレクトリとファイル 010.regression/ 020.dimentionality_reduction/ 030.classification/ 040.clustering/ 110.hea4_dos_clustering/ 120.tomography/ 130.descriptor_importance/ 140.exhaustive_search/ 150.Bayesian_optimization/ 160.recommender_system/ 500.itemset_mining/ 510.ERS/ 900.misc/ README.md data/ data_calculated/ 020.050.text.dimentionality_reduction_carbon8.ipynb • 8原子炭素結晶のデータセット • PCAで次元圧縮。
scikit-learnの次元圧縮クラスの説明 X: (N,P) 三次元に次元圧縮する場合の例を示します。 PCA X_pca: (N,3) from sklearn.decomposition import PCA pca = PCA(3) pca.fit(X) X_pca = pca.transform(X) t-SNE X_red: (N,3) from sklearn.manifold import TSNE red = TSNE(3) X_red = red.fit_transform(X)
データ取得(020.050) カテゴリー名がつい ているデータを観測 データとして読み込 む。 Jupyter notebookのcellの実行番号 デ ー タ 収 集 新規データとして読 み込む 説明変数カラム(descriptor_names) と原子環境カラム(splabel)の定義。 目的変数(y)は無い。
データ取得(つづき)とデータ加工 データ収集 観測生説明変数取得 観測説明変数規格化 データ加工 新規生説明変数取得 同じ規格化関数を用いたデータ規 格化で新規説明変数規格化 Xraw: (N,P) X: (N,P) Xraw_new: (Nnew,P) X_new: (Nnew,P)
データからの学習 寄与率、累積寄与率の評価 寄与率:pca.explained_variance_ratio_:リスト 累積寄与率:ある次元までの寄与率の和 寄与率の総和は1となるように規格化されている。 説明変数の全次元(特徴量数)を 用いてPCA変換を行う。 図示のための累 積寄与率のイン デックスのリス ト データか らの学習 indx: (P) esum: (P) 累積寄与率のリスト 変数の中身は以下でご確認ください。 print(indx, esum)
結果解釈 寄与率 累積寄与率 累積寄与率 plot_expratio:(次元 vs 寄与率もしくは累積寄 与率)の下の図を書く ユーザー定義外部関数 分かること: 一次元で説明変数空間の~80% 二次元までで説明変数空間の~90% を表現できている。 寄与率 一次元で十分かもしれませんが、以降の 図では二次元で説明変数空間の次元圧縮 を行い可視化します。
データからの学習 目的:二次元に次元圧縮すること。(2以上の数で変換して2次 元目までを用いても良い。) データか らの学習 観測データの次元圧縮 新規データの次元圧縮 X_rd : (N,ndim) X_rd_new: (Nnew, ndim)
結果解釈 二次元に次元圧縮した観測データ、その原子カテゴリー名、新規データを用いる。 可視化するユーザー定義外部関数 PCAの二軸目 観測データはラベル付きで大きな symbolで示される。 新規データは薄い 灰色点で示される。 PCAの一軸目
結果解釈 分かること: 1. 原子環境名は結晶構造を 可視化し目視で人がつけ た。この説明変数である 程度妥当な分離ができて いるらしい。 2. 二次元でそれなりに分離 ができているだろう。 3. 二次元でなく一次元だけ でもそれなりに分離がで きている。 sp2と sp2_tube: 周りに3原子 ある原子環境 sp3: 周りに4原子 ある原子環境 sp2_edgeとsp: 周りに2原子あ る原子環境 推測できること: 新規データ(薄い点)もこの クラスタリングで原子環境を 妥当に表現できていることが 期待される。
次元圧縮:多様体学習 T-SNE 目的:毎回 同じ結果を 与える 距離 t-SNE: 類似度に変換してから次元圧縮を行 う。この際に距離を制限する。 元々の次元(説明変数数)で無いと完全に 距離関係を保つことは(多分)できないので、 低次元に変換する際に低次元空間に確率的 にデータ点を置く。この際に乱数が入る。 確率的な配置 metric={文字列} 考慮する近傍点 の数 Default, metric=‘euclidean’ Perplexity={実数} 観測データ数以 下、5-50を考え よ、とある。 random_state={整 数}
距離を制限した多様体学習の利点 スイスロールの展開 距離を制限した方法 考慮外 距離 考慮す る距離 近い 全距離を考慮する方法 遠い TECHNICAL COMMENTS, Nature, Eric L. Schwartz, Nature 295 (2002).
次元圧縮:多様体学習 目的:t-SNEを用いた次元圧縮と可視化。 TSNEは.fit_transform()の形しかない。新規データを変換できる表式になっていないから。 次元圧縮をして ユーザー定義外 部関数で可視化 する。 random_state, perplexityで結果がかなり変わる。 教師なし学習なのでどのパラメタが妥当ということは無い。 カテゴリー分離がうまくできていなくても、失敗というわけでは無い。(教師なし学習だから。)
多様体学習結果の可視化 分かること: sp3は他の環境と大きく異 なる。sp2-tubeはsp2と比 べて少しだけsp3に近い位 置にある。 図:Cell[9]の出力図
LLMを利用した問題 020.050を参考にして,XとXnewが与えられたとして, PCAで二次元に次元圧縮して下の図を書くPythonスク リプトをLLMで書いてください。 X,Xnew取得部分を020.050からコピペして実行して図 を書いてください。 部分毎作成しても構いません。 解答例は020.200に保存 図:020.200でMicrosoft Copolotを利用 コードにより作成した図。
その他の次元圧縮 Q. 次元圧縮は低次元で可視化するため? A. 次元圧縮はかなり広い概念を含みます。 ニューラルネットワークのオートエンコーダーで潜在空間に変換することも次元 圧縮手法の一つです。 また、160.recommender_system/は教師なし学習の次元圧縮を用いた探索手法です。 データインスタンス数が少ない場合は次元圧縮を用いた方が高速に探索を行える 場合があります。
今回の内容 内容 次元圧縮 分類 クラスタ リング
分類(classification) 目的:カテゴリ目的変数のモデル当てはめ及び予測。 一方,回帰は連続目的変数のモデル当てはめ及び予測。
ディレクトリとファイル 010.regression/ 020.dimentionality_reduction/ 030.classification/ 040.clustering/ 110.hea4_dos_clustering/ 120.tomography/ 130.descriptor_importance/ 140.exhaustive_search/ 150.Bayesian_optimization/ 160.recommender_system/ 500.itemset_mining/ 510.ERS/ 900.misc/ README.md data/ data_calculated/ delete_markdown_cell.py* 030.050.text.logistic_regression.ipynb
Scikit-learnの予測モデルクラスとそのCVクラス Lassoモデルを得る LogisticRegression分 類モデルを得る ハイパーパラメタ を与えてLassoモデ ル当てはめを行う ハイパーパラメタ を最適化してLasso 予測モデルを作る ハイパーパラメタ を与えて LogisticRegressionモ デル当てはめを行 う reg=Lasso(…) Cls=LassoCV(…) cls=LogisticRegression(…) 図:LassoとLassoCV ハイパーパラメタ を最適化して LogisticRegression予 測モデルを作る cls=LogisticRegressionCV(…) 図:LogisticRegressionとLogisticRegressionCV
Scikit-learnの関数 * ロジスティック回帰 from sklearn.linear_model import LogisticRegression cls = LogisticRegression(penalty="L1",C=C) C: ハイパーパラメタ cls.fit(X,y) ypred = cls.predict(X) * 交差検定ロジスティック回帰 from sklearn.linear_model import LogisticRegressionCV kf = KFold(5, shuffle=True) cls = LogisticRegressionCV(penalty="L1",cv=kf) cls.fit(X,y) ypred = cls.predict(X) X:(N,P) y: (N) ypred:(N) 分類モデルを得る ハイパーパラメタ を与えてモデル当 てはめを行う ハイパーパラメタ を最適化して予測 モデルを作る cls=LogisticRegressio n(…) cls=LogisticRegressio nCV(…)
Scikit-learnの関数 分類評価指標 目的変数観測値: y(N) ,目的変数予測値:ypred(N), 目的変数カテゴリ数:K * 混同行列 from sklearn.metrics import confusion_matrix cm = confusion_matrix(y,ypred) # np.ndarrayが返る。 (K,K) * それぞれの評価指標値 from sklearn.metrics import accuracy_score from sklearn.metrics import precision_score, recall_score, f1_score score = accuracy_score(y,ypred) average=“weighted” # 加重平均で一つの全体の評価指標値を得る prec = precision_score(y,ypred, average=average) recall = recall_score(y,ypred, average=average) f1 = f1_score(y,ypred, average=average) * classification report from sklearn.metrics import classification_report 文字列 msg = classification_report(y,ypred) # 文字列を返す。 print(msg)
Scikit-learnの関数 「交差検定の予測値」を得る関数。 (N) from sklearn.linear_model import LogisticRegression from sklearn.model_selection import cross_val_predict cls = LogisticRegression(C=C_opt) kf = KFold(5, shuffle=True) yp_cv = cross_val_predict(cls, X, y, cv=kf) 分類モデルの予 測値を得る 与えれた予測モ デルの予測値 交差検定過程で の複数予測モデ ルに対する予測 値 yp=cls.predict(X) yp= cross_val_predict(c ls,X,y)
データ取得 030.050 目的:生説明変数と生目的変数の取得 ファイルから 観測データの 読み込み (N,P) (N) 生説明変数 生目的変数の生成
データ加工 目的:データ規格化関数生成と加工(規格化)された説明変数の取得 目的変数をカテ ゴリー値に変換 y:(分類の)目的変数、 カテゴリー数:K このデータではK=2 (N) データ規格化 (N,P) X: 規格化された説明変数:
データからの学習 目的:最適なハイパーパラメタ値を得る 五回交差検定、ランダ ムに分割 1.交差検定ロジスティッ ク回帰の定義。 ハイパーパラメタCは defaultでは1e-4から1e+4を 10分割します。 2.ロジスティック回帰の 最適ハイパーパラメタを求 める。 3.全観測データ(X,y)を 用いて一つだけ予測モデル を求める。 出力:三角マークは押せる。
データからの学習と評価指標 目的: 「交差検定の予測値」(yp_cv: (N) )の生成と「交差検定の予測値」を用いた分類評価指標 値の出力。 最適なハイパーパラメタ(cls_cv.C_[0])がすでに求まった。 ハイパーパラメタ最適値を用いてロ ジスティック回帰モデルを定義 (N) 、交差 検定の予 測値 五回「交差検定の予測値」を生成す る。 「交差検定の予測値」を用いた分類 評価指標値の出力
データからの学習:各種評価指標 目的:各種評価指標の個別計算値を得る。 加重平均 スカ ラー 加重平均の場合は全体の 指標なのでスカラー
データからの学習:混同行列 目的:混同行列の作成。 cls_cv.classes_: (K) カテゴリ数 (K) (K) (K,K) 混同行列を作るためのカテゴリーに使える。 行内に収まるよう に改行した。
データからの学習(2) 目的:交差検定の予測値と全観測データを用いて生成した予測モデルによる予測値の比較。 全観測データを用いて生成した予測モデルによる予測値と予測確率の生成 (N) (N,K) 全観測データを用いて生成した予測値を用いた混同行列 (K,K) 未知データは無いので、 全観測データを用いる。
LLMを利用したソースコード生成
分類手法でサポートベクターマシンがあるらしいの
で,サポートベクターマシンを使ってみたい。
サポートベクターマシ自体のLLMによる知識獲得は
別途行うとして,
1. 初心者はscikit-learnドキュメントを読むと情報量
が多すぎて理解できない。
2. LLMに尋ねて実行に必要な部分のみを作成させる。
Pythonの以下のコードを書いてください。
scikit-learnのGridSearchCVを用いてsupport vector
machineのハイパーパラメタを最適化する例を書い
てください。
030.200
Microsoft Copilotの回答から抜粋
# パラメータグリッドを定義します
param_grid = {'C': [0.1, 1, 10, 100, 1000],
'gamma': [1, 0.1, 0.01, 0.001, 0.0001],
'kernel': ['rbf']}
# SVMモデルを作成します
svc = svm.SVC()
# GridSearchCVを作成します
grid = GridSearchCV(svc, param_grid, refit = True, verbose = 3)
問題 解答例 030.210スクリプト 03.050を参考にしてLogistic Regressionを用いた 分類問題のPythonコードを書いてLogistic Regressionのハイパーパラメタ vs F1スコアの図 を書いてください。 入力を規格化済み説明変数(X),目的変数(y), 交差検定で評価するLogistic Regressionのハイ パーパラメタの値のリスト(C_list)とします。 X,y,C_listを代入する部分までは030.050からコピ ペしてください 図:020.200により作成されたハイパーパラメタ vs F1スコアの図
その他の例 010.regression/ 020.dimentionality_reduction/ 030.classification/ 040.clustering/ 110.hea4_dos_clustering/ 120.tomography/ 130.descriptor_importance/ 140.exhaustive_search/ 150.Bayesian_optimization/ 160.recommender_system/ 500.itemset_mining/ 510.ERS/ 900.misc/ README.md data/ data_calculated/ delete_markdown_cell.py* 030.120.answer.mono_structure_logisticregressionCV.ipynb 単元素からなる基底状態の結晶構構造 OvR法による多値分類問題例
今回の内容 内容 次元圧縮 分類 クラスタ リング
クラスタリング 目的: データの類似度(距離)に基づいたグループ分け。 解析時に目的変数を設定しない教師なし学習。
ディレクトリとファイル 010.regression/ 020.dimentionality_reduction/ 030.classification/ 040.clustering/ 110.hea4_dos_clustering/ 120.tomography/ 130.descriptor_importance/ 140.exhaustive_search/ 150.Bayesian_optimization/ 160.recommender_system/ 500.itemset_mining/ 510.ERS/ 900.misc/ README.md data/ data_calculated/ delete_markdown_cell.py* 040.050.text.clustering.ipynb
データ取得 炭素構造データを用いる。 観測データ取得 (N,P) (Nnew,P) (Nnew) Sp結合名の取得 sp, sp2, sp2_edge, sp2_tube, sp3 カテゴリー名が ついている観測 データを新規 データとして取 得
KMeans法によるクラスタ予測 目的:X,X_PCA,クラスタ予測値(yp_km)の作成。 観測生データ取得 (N,P) (N,2) データ規格化 可視化用に二次元に次 元圧縮した説明変数 クラスター数(K)=3と してk-means法を用いる (N,P) 学習と予測 暗黙的に:ユー クリッド距離を 用いる。
可視化 目的:クラスタリング結果解釈の前にデータそれ自体の可視化して解釈する。 新規データの取得 (Nnew,P) (Nnew,P) (Nnew,2) 規格化変換 可視化用に二次元に次元圧縮変換 PCA2 ユーザー定義関数による可視化 1.データ分布は分離していない。 2.右肩下がりの斜めに分布している。 PCA1
結果解釈 k-means法を用いたクラスタリングと予測(再出) (N) 学習は説明変数の みを用いる。 X_PCA: (N,2), yp_km:(N) ユーザー定義関数 可視化のalpha channel (答えを知っているので 分かるが、)このデータ ではKmeans法では妥当に クラスタリングできない。 図: 040.050 Cell[6]の プロット
ガウス混合法 目的:ガウス混合法を用いたクラスタリングと可視化 (NCLUSTERS=3) (N) X_PCA: (N,2), yp_gmm:(N) 可視化のalpha channel 暗黙的にユークリッド距離を用いる。 (答えを知っているので 分かるが、)このデータ ではk-means法より妥当に クラスタリングできた。
LLMによるコード生成 Microsoft copilot ガウス混合法によるクラスタリングと 可視化を行うソースコードを書きたい。 以下のPythonコードを作成してください。 # 入力 X: 説明変数 # 過程 1. GaussianMixtureで3つにクラスタリン グする。クラスタ番号をypとする。 2. 変数XをPCAで二次元に変換して変数 Xpcaに入れる。 3. yp毎にXpcaの散布図を書く。 from sklearn.mixture import GaussianMixture from sklearn.decomposition import PCA import matplotlib.pyplot as plt # GaussianMixtureで3つにクラスタリング gmm = GaussianMixture(n_components=3) gmm.fit(X) yp = gmm.predict(X) # 変数XをPCAで二次元に変換 pca = PCA(n_components=2) Xpca = pca.fit_transform(X) # yp毎にXpcaの散布図を書く plt.figure(figsize=(10, 7)) for i in range(3): plt.scatter(Xpca[yp == i, 0], Xpca[yp == i, 1], label=f'Cluster {i+1}') plt.legend() plt.show()
実行 040.200 入力変数を補足して実 行した。 図:040.200 Cell[2]の出力図。
データ取得 同じ040.050の後半に記載している。 (Nnewでは教材として可視化するためには数が多いので)データインスタンス数をまず減らす。 (15,P), (15) 15に数を減らした説明変数とそのカテゴリー名 参考)変数の中身を見るには,たとえば、Jupyter notebookのセルにans_list_sampleと入力し実行する。
階層クラスタリング 目的:階層クラスタリングと可視化 X_sample: (15,P)とans_list: (15)を用いる。 (15*14/2)、一次元化 した上三角行列成分。 行列と一次元配列の 変換はsquareform関数 が用意されています。 Dendrogram上流 の位置情報が入 る。 ユークリッド距離を用いて距 離行列の計算をする。 上位のクラスタ間の距離の計 算方法としてcomplete法を用 いる。 上流から下 流への向き が左から右 へなるよう に書く。
Pdistで使用可能なmetric(距離実装) scipy.spatial.distance.pdistのNotes部分 使用可能な距離実装(metric)の名 前と定義、使い方例が書いてある。 Please tell me about the distance implementations available in pdist and their keywords. ChatGPT Classic 1. **Euclidean Distance (`'euclidean'`)**: - The most common metric, it represents the "ordinary" straight-line distance between two points in Euclidean space. 2. **Manhattan Distance (`'cityblock'`)**: - Also known as the "city block" distance. It is the sum of the absolute differences of their Cartesian coordinates. …
上位クラスター間の距離定義(method) Scipy.cluster.hierarchy.linkageの説明 Please tell me about the method implementations available in linkage and their keywords. 1. **Single Linkage (`'single'`)**: - In single linkage, the distance between two clusters is defined as the shortest distance between any two points in the clusters. This method tends to produce long, "chain-like" clusters. “complete”は下位クラスターに含まれるデー タ点間距離の最大値。 2. **Complete Linkage (`'complete'`)**: - In complete linkage, the distance between two clusters is defined as the longest distance between any two points in the clusters. This method avoids the chaining effect and tends to produce more compact clusters. …
可視化結果 近接原子2 つ 近接原子4 つ 近接原子3 つ 図:050.050 Cell[11]の出力図。 階層クラスタリングは対話的なク ラスタリング手法です。 対話的の意味: 解析者の目的に応じて、パラメタ (Metric, method)を選択できます。
LLMによるコード生成 040.050のX_sample,ans_list_sampleを入力として 階層クラスタリングを行いたい。 以下のPythonコードを書け。 # 入力 X_sample: 説明変数 ans_list_sample: データインスタンスの名前 # 過程 euclidean距離でデータセットX_sample内のすべての ペア間のユークリッド距離(pairdistance)を計算します。 計算されたペアワイズ距離(pairdistance)に基づいて complete linkageで階層的クラスタリングを実行しま す。結果をZとします。 階層的クラスタリングの結果(Z)をデンドログラム として表示します。 Microsoft Copilot import numpy as np from scipy.spatial.distance import pdist, squareform from scipy.cluster.hierarchy import linkage, dendrogram import matplotlib.pyplot as plt # X_sample: 説明変数 # ans_list_sample: データインスタンスの名前 # euclidean距離でデータセットX_sample内のすべてのペア間のユークリッド距離 (pairdistance)を計算します。 pairdistance = pdist(X_sample, 'euclidean') # 計算されたペアワイズ距離(pairdistance)に基づいてcomplete linkageで階層的ク ラスタリングを実行します。結果をZとします。 Z = linkage(pairdistance, 'complete') # 階層的クラスタリングの結果(Z)をデンドログラムとして表示します。 plt.figure(figsize=(7, 5)) plt.title('Hierarchical Clustering Dendrogram') plt.xlabel('sample index') plt.ylabel('distance') dendrogram(Z, leaf_rotation=90., leaf_font_size=8., labels = ans_list_sample) plt.show()
実行 040.210 図のサイズを小さく修 正している。 図:040.210 Cell[2]の図。
参考 010.regression/ 020.dimentionality_reduction/ 030.classification/ 040.clustering/ 110.hea4_dos_clustering/ 120.tomography/ 130.descriptor_importance/ 140.exhaustive_search/ 150.Bayesian_optimization/ 160.recommender_system/ 500.itemset_mining/ 510.ERS/ 900.misc/ README.md data/ data_calculated/ delete_markdown_cell.py* 040.110.answer.fe2_clustering.ipynb 鉄構造データに対して ⚫ クラスタリング ⚫ 階層クラスタリング ◆ データインスタンスに関して ◆ 説明変数に関して • 独自距離定義方法
以上です。