6.3K Views
August 04, 23
スライド概要
ChatGPTを利用したPython Script Widgetの作成。ChatGPTを利用したPython Scriptの作成
マテリアルズインフォマティクスチュートリアル
(超初心者向け)Orange Data Miningによるマテリアルズ・イ ンフォマティクスハンズオン 第三回 2023/08/04版 木野日織 (きのひおり)
前置き 大規模言語モデル(LLM)でなく,わかりやすくす るためにここでは具体的にChatGPTもしくはGPT-3.5, GPT-4と書きます。 はじめに,ChatGPTを利用する場合にはオプトアウ トの仕方を各自ご確認ください。
ChatGPT ChatGPTの使用法は、簡単に言うと「プロンプト(Prompt)を用いて対話すること」です。 プロンプトとは、ユーザーがChatGPTに送信する入力テキストのことを指します。ChatGPT はそのプロンプトに基づいて応答を生成します。 ChatGPTの得意なこと 時系列記述,共通化,カテゴリ分けが得意。 GPT-4へのプロンプト Represent the photo emission spectroscopy and the surface scattered light method experiment process in time sequence. Commonize the same processes. Display the results in a single hierarchical manner. photo emission spectroscopy measures binding energy at surface points. Surface scattered light method experiment measures two theta at surface points. photo emission spectroscopyとsurface scattered light methodの 時系列かつ項目の共通化と別手法の階層的な記述を求める。
GPT-4の回答 Photo emission spectroscopy (PES) and surface scattered light method (SSLM) are two different experimental techniques for investigating surface properties. PES measures the binding energy of electrons at surface points, while SSLM measures the scattering angle (two theta) at surface points. Although these two techniques differ in their focus, they share several common processes. Below is a hierarchical representation of the processes in time sequence, with common processes combined: ③時系列 ④ 1. Preparation: a. Sample preparation: i. Clean and/or polish the sample surface ii. Mount the sample on the sample holder b. Experimental setup: i. Set up the vacuum chamber ii. Align the sample in the chamber ③ ③ ④別手法の階 層的記述 ①かなり狭い専門領域の知識と思うがGPT-4は答えられる。 ②時系列,項目の共通化,別手法の階層的な記述が行える。 2. Data acquisition: a. Common processes: i. Evacuate the chamber to achieve the desired vacuum level ii. Shine the incident light/beam (X-ray or UV for PES, visible light or X-ray for SSLM) onto the sample surface iii. Collect scattered/reflected light/beam from the surface b. Technique-specific processes: i. PES: Measure the kinetic energy and number of emitted photoelectrons ii. SSLM: Measure the scattering angle (two theta) of the scattered light/beam ⑤ ③ ⑤項目の 共通化 ④ 3. Data processing and analysis: a. Common processes: i. Process the raw data into a suitable format for analysis ii. Normalize the data to account for background and other factors b. Technique-specific processes: i. PES: Calculate the binding energy of electrons at surface points using the measured kinetic energy ii. SSLM: Determine the surface structure and/or composition based on the measured scattering angle (two theta) ⑤ ③ ④ ⑤ 4. Results interpretation and reporting: a. Interpret the processed data to draw conclusions about the sample's surface properties ③ b. Compile the findings into a report, including figures and tables to represent the data and results This hierarchical representation combines the common processes of both experiments while maintaining the unique aspects of each technique.
ChatGPTの利用 ChatGPTを利用して • かなりマイナーなOrange Python widgetや • Pythonスクリプトの作成 を行う。 Orangeに無い機能をPythonスクリプトで補完することで,マテリアル ズ・インフォマティクスに関しても少し話します。
目次 タスク1:ChatGPTを利用したベクトルデータの次元変換Python widgetの作成 タスク1’: ChatGPTを利用したカラム名を利用したデータ選択とベクトルデータの次元変換Python widgetの作成 タスク2:交差検定でDOSのセミコア元素分類logistic回帰予測モデルとクラスタリング タスク3:semicoreカラムとClusterカラムから“分類性能”を評価するPython widgetの作成 タスク4:semicoreカラムとClusterカラムから“混同行列”を評価するPython widgetの作成 タスク5:タスク2の解析を行うPythonコードをChatGPTで作成。
タスク1,1’の背景 ① ④ 解析では N:データインスタンス数 P:説明変数種類数 ② 𝑤𝑤:物性値ベクトル (サイズP) 𝑋𝑋:実験の設定により決まる行列(サイズ(N,P)) 𝑦𝑦: 観測量ベクトル(サイズN) としてそれらの関係が 𝑦𝑦 = 𝑋𝑋𝑋𝑋 という形であり,線形回帰モデル係数𝑤𝑤に0が多 い場合,Lassoを用いると,𝑁𝑁 < 𝑃𝑃,つまり方程式 数Nが未知数Pより少ない条件でも𝑦𝑦と𝑋𝑋から𝑤𝑤を一 意に求めることが可能です。 ③ 問題例: トモグラフ像再構成 フーリエ級数展開などの線形基底変換 𝑤𝑤 ⋮ ⑤ 𝑤𝑤は画像と して二次元 で確認。 ⑥変換を Python widgetを用い て行う。 一次元ベクトル として扱う
タスク1:データの次元変換 目的: • 一次元データの二次元データへの変換を行う。 • Python widgetに慣れてもらう。
3.01.show_image.ows 使用するワークフロー
データ ① ①一次元ベクト ルを読み込む。 {prefix}/data/w_L 64_Orange.csv ② ②一次元から 二次元データ に変換 ③ ③二次元データ として可視化 4096のデータインスタンスを 持つ列ベクトル
Python widgetの入出力 今はデータ(Data)入出力のみ考える。
Python widget ② [Python script] window ④Editorパネル ⑥入力: in_data 出力: out_data となるように書く。 ① ⑤Consoleパネル ⑦関数引数である in_data変数が存在して いるとしてインタプリ ターが起動中。 ③4096行の入力データ
Python widget ②関数中身の点線部分をインデントなしにEditor部分に 記載する。 ①Python scriptの例 def python_script(in_data): import numpy as np from Orange.data import Table, Domain, ContinuousVariable # 入力データの次元を取得 n = int(np.sqrt(len(in_data))) # 入力データを (N, N) の二次元行列に変換 matrix_data = np.reshape(in_data, (n, n)) # Orange のデータテーブルを作成 domain = Domain([ContinuousVariable(f'feature{i+1}') for i in range(n)]) out_data = Table.from_numpy(domain, matrix_data) return out_data, …
ChatGPTへのプロンプト 最初はGPT3.5を利用。その後GPT-4を利用。
ChatGPTへのプロンプト タスク1でして欲しいことをプロンプトとして説明をする。 青色は他のタスクに対しても必要なプロンプト。 ① ② ③ ④ ⑤ Orange Data MiningのPython widgetを作ってください。 私はPythonの初心者です。平易なコードを作成してください。コメントで説明を追加してください。 Python widgetの入力引数名をin_data,出力データをout_dataとします in_dataとout_dataは Orange.Data.Tableのインスタンスです。 in_dataは一次元の列ベクトル,もしくは行ベクトルが入っています。 これはN*Nのサイズです。こ れを(N,N)のサイズの二次元行列に変換してout_dataにしてください。 Python widgetの中に書きますのですでにin_data変数が存在しています。関数のその他のコードだけ 書いてください。Python widgetの中に書きますのでreturn文は不要です。 ①大目的。 ②無いと難しいコードを書く。 ③GPT-3.5では必要。GPT-4では不要な場合が多いようです。 ④具体的に行ってほしいこと。失敗することもあるがN*Nのサイズの一次元ベクトルから N=sqrt(N*N)とする程度の思考はできる。 ⑤無いとdef文を含む関数を書くかもしれない。
ChatGPTへのプロンプト
プロンプトと回答 回答 回答のコード部分を拡大 import numpy as np # Orangeデータテーブルの配列を取得します。Orangeデータテーブル は基本的にnumpyのndarrayに類似しています array = in_data.X # arrayの長さの平方根を取得します(Nを見つけるため)。Orange Data Miningでは、データは行または列のベクトルとして入力される ため、 # その長さの平方根を取ることで、変換されるべき正方形マトリック スの次元を得ることができます。 N = int(np.sqrt(array.size)) # 入力配列をNxN行列に変換します。 reshaped_array = array.reshape(N, N) # 二次元配列をOrangeデータテーブルに変換します。 from Orange.data import Domain, Table # すべての特徴が連続的(つまり、数値)であるドメインを作成しま す。 domain = Domain([ContinuousVariable(f'feature {i}') for i in range(N)]) # 二次元配列を新しいOrangeデータテーブルに変換します。 out_data = Table(domain, reshaped_array)
Python widgetでの実行 回答 回答を[Python Script]Editor部分にコピペ ①コピペ ←④エラー箇所 ②実行 ←③エラー発生
修正依頼 ①このエラーメッセージをコピペして修正依頼をプロンプトに書きます。 ②回答が修正項目とコードを出力します。 プロンプト 回答のコード部分を拡大 ① import numpy as np from Orange.data import Domain, Table, ContinuousVariable # Orangeデータテーブルの配列を取得します。Orangeデータテーブルは基本 的にnumpyのndarrayに類似しています array = in_data.X # arrayの長さの平方根を取得します(Nを見つけるため)。Orange Data Miningでは、データは行または列のベクトルとして入力されるため、 # その長さの平方根を取ることで、変換されるべき正方形マトリックスの次 元を得ることができます。 N = int(np.sqrt(array.size)) # 入力配列をNxN行列に変換します。 reshaped_array = array.reshape(N, N) # すべての特徴が連続的(つまり、数値)であるドメインを作成します。 domain = Domain([ContinuousVariable(f'feature {i}') for i in range(N)]) # 二次元配列を新しいOrangeデータテーブルに変換します。 out_data = Table(domain, reshaped_array)
Python widgetでの実行 ①上書きコピペ ②Runを 押す。 ③エラーなし。 ④64行の出力データ
二次元表現の可視化 ②[Heat Map] window ② ① ①点線が実線になった (上流が実行されてLink にデータが存在する) ことを確認
GPT-3.5の利用 GPT-3.5で容易に可能と思われたかもしれませんが,お見せしたのはうまくいった例です。 GPT-3.5では成功率はかなり低いのが実情です。 次ページに動画あり
GPT-4の利用 GPT-4ではかなり高い成功率です。 次ページに動画あり
タスク1でのChatGPT利用 ⑤ ① Python Script widgetの コンソールパネルの エラー確認 ④ プロンプト/ エラー報告 ⑥ ② Python Script widgetの実行 ChatGPTの回答 ③ Python Script widgetのエ ディタパネルへコピー 簡単なPython script ならばこれでOK
Python script ChatGPT作成のPython scriptは {prefix}/python/3.01.GPT3-5.py {prefix}/python/3.01.GPT4-take?.py に保存。
目次 タスク1:ChatGPTを利用したベクトルデータの次元変換Python widgetの作成 タスク1’: ChatGPTを利用したカラム名を利用したデータ選択とベクトルデータの次元変換Python widgetの作成 タスク2:交差検定でDOSのセミコア元素分類logistic回帰予測モデルとクラスタリング タスク3:semicoreカラムとClusterカラムから“分類性能”を評価するPython widgetの作成 タスク4:semicoreカラムとClusterカラムから“混同行列”を評価するPython widgetの作成 タスク5:タスク2の解析を行うPythonコードをChatGPTで作成。
タスク1’ 選択行 タスク1では全部の値を用た。 今回は coefカラム名を利用したデータ選択と 一次元データの二次元データへの変換 GPT-4を用いる。
3.02.reconstruction.ows
観測データ 文字フォントLの文字の部分を二次元物質とした場合の トモグラフ像観測データ ファイル:{prefix}/data/Xy-4_L64_Orange.csv N=1024, P=4096, N<P
ワークフローの設定 ①{prefix}/data/Xy-4_L64_Orange.csv ① ② ②Fit interceptにチェック。 Lasso regression (L1)を選択。 Regularization strength 0.0007を選択。 ③最初は点線のはず。 ③
回帰係数の表示 ②[Data Table] window ③ ① ④coefカラムはN*Nの一次 元列ベクトル。それらを (N,N)に直し,二次元デー タを可視化できる[Heat Map]で表示させる。
回帰係数の表示 ②[Heat Map] window ① Interceptを 除いた行の coefを(N,N) に変換する。
GPT-4プロンプト …が無い。 多少間違った記述がありますが,このプロンプトを用います。
GPT-4回答コード
import numpy as np
from Orange.data import Domain, Table
# in_dataからintercept行を除去します
filtered_data = in_data[in_data["name"] != "intercept"]
# coefカラムの値を抽出し、numpy配列に変換します
coef_values = np.array([d["coef"].value for d in filtered_data])
# numpy配列の形状を(N, N)の二次元行列に変換します
N = int(np.sqrt(len(coef_values))) # Nを計算します
reshaped_values = coef_values.reshape(N, N)
# 新しいOrangeのデータテーブルを作成します
domain = Domain([f'Feature{i+1}' for i in range(N)]) # ドメイ
ンを作成します
out_data = Table.from_numpy(domain, reshaped_values)
←in_dataはDataFrameでは無い。そして,
Filtered_dataはindexでないので,期待
通りの動作はしないだろう。
と思うが実行。
Python widgetでの実行 ①Pythonコードをコピペして ②押して実行 ③エラーが 起きている。
Python widgetでの実行 ③最初の文でエラーが起きている。 ①人がエラー箇所を特定する。 例えば,Editorの5行目をコピーして ConsoleにペーストしてReturnキーで実行 させる。 ②同じエラーが起きる。 先程のエラーの原因。
GPT-4プロンプト この後,色々やってみたが私の場合は, Orange.Data.Tableのままではうまくコード をつくれない。 filtered_data = in_data[in_data[“name”] != “intercept”]文はDataFrameの操作だと DataFrameの知識がある人は分かる。 ChatGPTがOrange.Data.TableとDataFrameを 混同しているようなので,In_dataを一度 DataFrameに変換して, DataFrameで操作 するように指示し直します。
GPT-4回答コード
import numpy as np
import pandas as pd
from Orange.data.pandas_compat import table_to_frame
from Orange.data import Domain, Table
# 1. Orange Data TableをpandasのDataFrameに変換します
df = table_to_frame(in_data)
←修正点
# 2. 'intercept'行を除いた'data'カラムの値を取得します
filtered_data = df[df["name"] != "intercept"]["coef"]
# 3. 値をN*Nの二次元行列に変換します
N = int(np.sqrt(len(filtered_data))) # Nを計算します
reshaped_values = np.array(filtered_data).reshape(N, N)
# 4. 二次元行列をOrange Data Tableに変換します
domain = Domain([f'Feature{i+1}' for i in range(N)]) # ドメインを作成します
out_data = Table.from_numpy(domain, reshaped_values)
①上書きでEditorパネ
ルへコピペする。
②Runで実行する。
③Consoleでエラ-が起
きる。
←修正点
Python widgetでの実行 ②’ ④ ←③ ←① Consoleパネルで ①KeyError “name”とあり, df[“name”]でエラーが起きてい るらしい。 Consoleパネルで各行を実行して みます。 ②df=の行(Editor panelで②’)は 実行でき,dfは生成されている。 ③しかし,dfを表示するとname カラムが無い。 ④行で失敗していますが,原因 はdf=の行②’にあるようです。 ←② このデータでNameカラムは metadataだった。そのせいでdf のnameカラムが生成されなかっ たのでは,と推測できます。
GPT-4プロンプトと回答 回答 import pandas as pd from Orange.data.pandas_compat import table_to_frame # Orange Data Tableを含めてpandasのDataFrameに変換します df = table_to_frame(in_data, include_metas=True) ←修正点 Editorで上の部分のみを修正して再度実行
Python widgetでの実行 しかし,まだエラーが起きる。 ←エラー箇所 ①Editorから一行づつConsole へコピペして実行していく。 ②今度はdomain行でエラーが 起きていることが分かる。
GPT-4プロンプト
GPT-4回答
回答
import numpy as np
import pandas as pd
from Orange.data.pandas_compat import table_to_frame
from Orange.data import Domain, ContinuousVariable, Table
# Orange Data Tableを含めてpandasのDataFrameに変換します
df = table_to_frame(in_data, include_metas=True)
# 'intercept'行を除いた'data'カラムの値を取得します
filtered_data = df[df["name"] != "intercept"]["coef"]
# 値をN*Nの二次元行列に変換します
N = int(np.sqrt(len(filtered_data))) # Nを計算します
reshaped_values = np.array(filtered_data).reshape(N, N)
# 二次元行列をOrange Data Tableに変換します
domain = Domain([ContinuousVariable(f'Feature{i+1}') for i in range(N)]) # ドメインを作成します
out_data = Table.from_numpy(domain, reshaped_values)
Python widgetでの実行 ①エラーなし。
Lassoにより画像再構成した物質(フォント)の表示 ②[Heat Map] window (N,N)の入力データを可視化。 ③ {prefix}/python/3.02.GPT4.py ① 何ができたかを追加すること
タスク1’でのChatGPT利用 ⑦人の指示 ⑤ Python Script widgetのコンソー ルパネルのエラー 確認 ① プロンプト/ エラー報告 ⑥ ② ④ Python Script ChatGPTの回答 widgetの実行 ③ Python Script widgetのエ ディタパネルへコピー 少々複雑になると人 の指示が必要。
Python script {prefix}/python/3.02.GPT4.py として保存。
目次 タスク1:ChatGPTを利用したベクトルデータの次元変換Python widgetの作成 タスク1’: ChatGPTを利用したカラム名を利用したデータ選択とベクトルデータの次元変換Python widgetの作成 タスク2:交差検定でDOSのセミコア元素分類logistic回帰予測モデルとクラスタリング タスク3:semicoreカラムとClusterカラムから“分類性能”を評価するPython widgetの作成 タスク4:semicoreカラムとClusterカラムから“混同行列”を評価するPython widgetの作成 タスク5:タスク2の解析を行うPythonコードをChatGPTで作成。
タスク2 ChatGPT利用ではない。 タスク2A: 交差検定でDOSのセミコア元素分類logistic回帰予測モデル作成→タスク5 タスク2B: DOSのクラスタリング タスク2B1: PCAによる次元圧縮後にDOSのクラスタリング タスク2B2: t-SNEによる次元圧縮後にDOSのクラスタリング→タスク3,4
観測データ生成過程 ①固溶体第一原理計算のセミコア領域の電子状態密度,DOS(エネルギー毎の大きさ)を用いる。 ②第一原理計算過程 複数元素と原子 位置を指定 入力 第一原理 計算 出力 物理量 DOSもその一つ ③第一原理計算(演繹法)の因果関係 原因 結果 セミコア順位を持つ元素が 含まれる その元素の特徴を持つセミコアエネ ルギー領域のDOSが観測される。
分類・クラスタリング問題設定 ① ② セミコア元素の特徴を 持つDOS セミコア元素を答え(ラベル)として分類する。 ③ 該当するセミコア元素を説明変数空間で クラスタリングする。 ④光学スペクトルから物質を同定する問題設定と同じ。 ⑤簡単のため、セミコアエネルギー領域にセミコア順位を持つ元素を一つだけ含む元素組み合わせを選択する。
観測データファイル ①セミコアDOS観測データ ファイル:{prefix}/data/hea4_dos_selected_Orange.csv 300データインスタンス 50説明変数:セミコアエネルギー領域のエネルギー点 目的変数(6カテゴリ):セミコア元素としてBi,Hf,Hg,Mo,Nb,Sn 各目的変数毎50データインスタンス ③ ② Log10 (DOS(𝐸𝐸)) ④ valence 𝐸𝐸𝐹𝐹 Green関数からDOSを計算する際に、小さなImaginary partを入れているのでDOS(E)=0にはならない。 𝐸𝐸 Phys. Rev. Materials 6, 023802 (2022).
観測データ図示 似ている。 縦軸,横軸の範囲は全てのパネルで同じ。 似ている。 似ている。
タスク2 交差検定でDOSのセミコア元素分類logistic回帰予測モデル作成と クラスタリングを行う。(ChatGPT利用ではない。) タスク2A: 交差検定でDOSのセミコア元素分類logistic回帰予測モデル作成 タスク2B: DOSのクラスタリング タスク2B1: PCAによる次元圧縮後にDOSのクラスタリング タスク2B2: t-SNEによる次元圧縮後にDOSのクラスタリング
分類ワークフロー 既出ワークフロー(2.03.cls_CV.ows)に [Save Data]をつける。 ① data/hea4_d os_selected_ Orange.csv を選択 ③[Test and Score] Cross Validation Number of folds: 5 を選択 ③ ④[Confusion Matrix] Learners: Logistic Regression を選択 ②Regularization type: Lasso(L1)を選択。 ⑤追加
交差検定による分類性能 [Logistic Regression] window Lasso (L1)でC~4がもっとも F1が大きい。 [Test and Score] window,五回交差検定の場合 F1=0.980, 妥当なLogistic回帰による分類予測モデルが作成できた。
線形モデル係数 [Data Table (2)] window Lasso (L1), C=4, 係数0が多く,説明変数のごく一部の 特徴量で分類している。 =この説明変数で,各semicoreの”特徴” を表している。
Logistic regressionの係数を保存 [Save Data] window ① ② “{folder}/data_generated/dos_cls_coefficients.csv” →タスク5で係数を解析するPythonコードを ChatGPTで書く。その際に利用。
タスク2 交差検定でDOSのセミコア元素分類logistic回帰予測モデル作成と クラスタリングを行う。(ChatGPT利用ではない。) タスク2A: 交差検定でDOSのセミコア元素分類logistic回帰予測モデル作成 タスク2B: DOSのクラスタリング タスク2B1: PCAによる次元圧縮後にDOSのクラスタリング タスク2B2: t-SNEによる次元圧縮後にDOSのクラスタリング
3.03.dos_PCA_clustering.ows
クラスタリング過程 A) 観測データを読み込む。 B) 観測データを正規化する。 C) PCAで変換した観測データを次 元圧縮する。 D) 変換された観測データを正規化 する。 E) 変換された観測データをkMeansでクラスタリングする。 F) 変換された観測データをPCAで 次元圧縮する。 D) B) A) C) F) E) ①説明変数の種類数はPCAの 変換後の次元数。
詳細の設定 A){prefix}/data/hea4_dos_selecte d_Orange.csv B)Normalize features:Standarize μ=0,σ2=1。 C)6次元。Option: Normalize variablesをチェックしない。 D)選択しない。 E) Number of Clusters: Fixed=6 F) 2次元。Option: Normalize variablesをチェックしない。 (注意:[Preprocess]と[PCA]が 2つづつあります。) D) B) A) C) F) E)
PCAで次元圧縮した場合 • 六次元の説明変数 に対してk-Means法 を適用している。 • 表示は二次元で 行っている。 • Hf-Nb • Mo-Hg • Bi-Sn が隣り合っている。 もしくは混じってい る。 元々 • Hf-Nb • Mo-Hg • Bi-Sn はスペクトルがよく 似ていた。 Legendは 移動した。 Hf Bi Nb Mo Hg Sn
タスク2 交差検定でDOSのセミコア元素分類logistic回帰予測モデル作成と クラスタリングを行う。(ChatGPT利用ではない。) タスク2A: 交差検定でDOSのセミコア元素分類logistic回帰予測モデル作成 タスク2B: DOSのクラスタリング タスク2B1: PCAによる次元圧縮後にDOSのクラスタリング タスク2B2: t-SNEによる次元圧縮後にDOSのクラスタリング
3.04.dos_ML_clustering.ows
詳細設定 タスク2B2とC)以外は同じ。 A){prefix}/data/hea4_dos_ selected_Orange.csv B)Normalize features:Standarize μ=0,σ2=1。 C)Method=t-SNE, Metric=Euclidean,Perplexit y=25, components=2 D)選択しない。 E) Number of Clusters: Fixed=6 F) 2次元。Option: Normalize variablesを チェックしない。 D) B) F) A) C) E)
t-SNEで次元圧縮した場合 同一クラスターに異なる セミコアが混じっていま すが, PCAの場合より分布が分離 しているように見える。
目次 タスク1:ChatGPTを利用したベクトルデータの次元変換Python widgetの作成 タスク1’: ChatGPTを利用したカラム名を利用したデータ選択とベクトルデータの次元変換Python widgetの作成 タスク2:交差検定でDOSのセミコア元素分類logistic回帰予測モデルとクラスタリング タスク3:semicoreカラムとClusterカラムから“分類性能”を評価するPython widgetの作成 タスク4:semicoreカラムとClusterカラムから“混同行列”を評価するPython widgetの作成 タスク5:タスク2の解析を行うPythonコードをChatGPTで作成。
クラスタリングと分類 ワークフローで見る限りクラスタリングはできました。 分類での目的変数値と予測値は,クラスタリングでのセミコア元素名とクラスター名の対応関係と似 ているので,クラスタリング結果に対して分類で用いた混同行列と評価指標を計算してみます。(ク ラスタリングの評価指標にはなりません。) 分類 クラスタリング 目的変数 予測値 セミコア元素 クラスター名 Bi Bi Bi C1 Bi Bi Bi C1 Nb Bi Nb C1 Nb Nb Nb C2 似ている
3.05.dos_clustering_cls_score.ows 用いるワークフロー 修正部分 追加部分
“回帰スコア”評価 “回帰スコア”評価 に使う。 “混同行列”評価 に使う。
GPT-4プロンプト NGクラスタリング性能 OK 分類性能
GPT-4プロンプトと回答
回答
from Orange.data.pandas_compat import table_to_frame
from sklearn.metrics import f1_score, precision_score, recall_score, accuracy_score
from collections import Counter
import pandas as pd
from Orange.data import Table
# 1. Convert the input data to a pandas dataframe
df = table_to_frame(in_data, include_metas=True)
# 2. Extract "semicore" and "Cluster" categories and align the names
# Find the most common "Cluster" for each "semicore"
semicore_cluster_map = df.groupby('semicore')['Cluster'].agg(lambda x:
Counter(x).most_common(1)[0][0])
# Apply the mapping to the "semicore" column
df['semicore'] = df['semicore'].map(semicore_cluster_map)
# 3. Compute the clustering performance between "semicore" and "Cluster"
f1 = f1_score(df['semicore'], df['Cluster'], average='weighted')
precision = precision_score(df['semicore'], df['Cluster'], average='weighted')
recall = recall_score(df['semicore'], df['Cluster'], average='weighted')
accuracy = accuracy_score(df['semicore'], df['Cluster'])
# Create a DataFrame to hold the results
results_df = pd.DataFrame({
'F1 Score': [f1],
'Precision': [precision],
'Recall': [recall],
'Accuracy': [accuracy]
})
# Convert the results DataFrame to an Orange Table
out_data = Table.from_pandas_df(results_df)
Python widget実行 ①コピペ ④エラー箇所 ②実行 ③エラー
GPT-4プロンプトと回答 ① ② ③Orange.data.Tableには .from_numpyというメンバー関数があるので .from_pandas_dfというメンバー関数をある方が 整合性が良い。 … しかし,その関数はOrange.data.Tableでは作成 されていないで別関数を用いてデータフレーム に変換してくれる。
GPT-4プロンプトと回答
from Orange.data.pandas_compat import table_to_frame, pandas_df_to_table
from sklearn.metrics import f1_score, precision_score, recall_score, accuracy_score
from collections import Counter
import pandas as pd
# 1. Convert the input data to a pandas dataframe
df = table_to_frame(in_data, include_metas=True)
# 2. Extract "semicore" and "Cluster" categories and align the names
# Find the most common "Cluster" for each "semicore"
semicore_cluster_map = df.groupby('semicore')['Cluster'].agg(lambda x:
Counter(x).most_common(1)[0][0])
# Apply the mapping to the "semicore" column
df['semicore'] = df['semicore'].map(semicore_cluster_map)
…
# 3. Compute the clustering performance between "semicore" and "Cluster"
f1 = f1_score(df['semicore'], df['Cluster'], average='weighted')
precision = precision_score(df['semicore'], df['Cluster'], average='weighted')
recall = recall_score(df['semicore'], df['Cluster'], average='weighted')
accuracy = accuracy_score(df['semicore'], df['Cluster'])
# Create a DataFrame to hold the results
results_df = pd.DataFrame({
'F1 Score': [f1],
'Precision': [precision],
'Recall': [recall],
'Accuracy': [accuracy]
})
# Convert the results DataFrame to an Orange Table
out_data = pandas_df_to_table(results_df)
GPT-4プロンプトと回答 ①再びコピペして,RUNを押して実行→Consoleパネルでエラー発生 ② ③ ④ 後で示すが, Orange.data.pandas_compatに table_from_frameという関数が存在 するのでこれは間違った情報。 ⑤ 途中でファイルを使いたくない。今回は一度データフレームを作成している ことがこの困難の原因なので,データフレームを作らない方法を尋ねる。 ⑥
GPT-4プロンプトと回答 from Orange.data.pandas_compat import table_to_frame from sklearn.metrics import f1_score, precision_score, recall_score, accuracy_score from collections import Counter from Orange.data import Table, Domain, ContinuousVariable # 1. Convert the input data to a pandas dataframe df = table_to_frame(in_data, include_metas=True) # 2. Extract "semicore" and "Cluster" categories and align the names # Find the most common "Cluster" for each "semicore" semicore_cluster_map = df.groupby('semicore')['Cluster'].agg(lambda x: Counter(x).most_common(1)[0][0]) # Apply the mapping to the "semicore" column df['semicore'] = df['semicore'].map(semicore_cluster_map) # 3. Compute the clustering performance between "semicore" and "Cluster" f1 = f1_score(df['semicore'], df['Cluster'], average='weighted') precision = precision_score(df['semicore'], df['Cluster'], average='weighted') recall = recall_score(df['semicore'], df['Cluster'], average='weighted') accuracy = accuracy_score(df['semicore'], df['Cluster']) # Create the domain (variables) domain = Domain([ContinuousVariable(name) for name in ['F1 Score', 'Precision', 'Recall', 'Accuracy']]) # Create the data (in the form of a list of lists) data = [[f1, precision, recall, accuracy]] # Convert the data and domain to an Orange Table out_data = Table(domain, data)
Python widget実行 ①警告が出ている。動いてい るが修正を依頼する。
GPT-4プロンプトと回答 from Orange.data.pandas_compat import table_to_frame from sklearn.metrics import f1_score, precision_score, recall_score, accuracy_score from collections import Counter from Orange.data import Table, Domain, ContinuousVariable ① # 1. Convert the input data to a pandas dataframe df = table_to_frame(in_data, include_metas=True) # 2. Extract "semicore" and "Cluster" categories and align the names # Find the most common "Cluster" for each "semicore" semicore_cluster_map = df.groupby('semicore')['Cluster'].agg(lambda x: Counter(x).most_common(1)[0][0]) # Apply the mapping to the "semicore" column df['semicore'] = df['semicore'].map(semicore_cluster_map) # 3. Compute the clustering performance between "semicore" and "Cluster" f1 = f1_score(df['semicore'], df['Cluster'], average='weighted') precision = precision_score(df['semicore'], df['Cluster'], average='weighted') recall = recall_score(df['semicore'], df['Cluster'], average='weighted') accuracy = accuracy_score(df['semicore'], df['Cluster']) # Create the domain (variables) domain = Domain([ContinuousVariable(name) for name in ['F1 Score', 'Precision', 'Recall', 'Accuracy']]) # Create the data (in the form of a list of lists) data = [[f1, precision, recall, accuracy]] # Convert the data and domain to an Orange Table using Table.from_list out_data = Table.from_list(domain, data)
Python widget実行 ①エラー,警告がなくなる。
回帰評価指標出力 [Data Table (1)] window
今回の困難 out_data Tableへの変換 ① 分類性能評価 DataFrame Clusterとsemicoreを一致させる。 DataFrame DataFrameへの変換 in_data ①の可能性は DataFrame Numpy Array ①DataFrameでは作れないと GPT-4は報告。GPT-4は別イン スタンスとしてnumpy Array を選択しました
Python script 3.03dos_clustering_cls_score.owsのPython Script widget中と {prefix}/python/3.03.GPT4.pyに 保存。
目次 タスク1:ChatGPTを利用したベクトルデータの次元変換Python widgetの作成 タスク1’: ChatGPTを利用したカラム名を利用したデータ選択とベクトルデータの次元変換Python widgetの作成 タスク2:交差検定でDOSのセミコア元素分類logistic回帰予測モデルとクラスタリング タスク3:semicoreカラムとClusterカラムから“分類性能”を評価するPython widgetの作成 タスク4:semicoreカラムとClusterカラムから“混同行列”を評価するPython widgetの作成 タスク5:タスク2の解析を行うPythonコードをChatGPTで作成。
“混同行列”評価 3.05.dos_clustering_cls_score.ows “回帰スコア”評価 “混同行列”評価
GPT-4プロンプトと回答 タスク3続きとして df[“semicore”]とdf[“Cluster”]から計算する。 回答 from sklearn.metrics import confusion_matrix import pandas as pd # sklearnのconfusion_matrix関数を使用して混同行列を計算 matrix = confusion_matrix(df['semicore'], df['Cluster']) # カテゴリ名を取得 categories = sorted(set(df['semicore']).union(df['Cluster'])) 誤)カテゴリ変数説明変数とカテゴ リ変数目的変数 正)カテゴリ目的変数とその予測値 # 混同行列をデータフレームに変換 df_cm = pd.DataFrame(matrix, index=categories, columns=categories) Confusion_maxtrixとcategoriesの作成が別々なのが気持ち悪 いので修正依頼をする。
GPT-4プロンプトと回答 回答 from sklearn.metrics import confusion_matrix import pandas as pd # カテゴリ名を取得 categories = sorted(set(df['semicore']).union(df['Cluster'])) # sklearnのconfusion_matrix関数を使用して混同行列を計算 matrix = confusion_matrix(df['semicore'], df['Cluster'], labels=categories) # 混同行列をデータフレームに変換 df_cm = pd.DataFrame(matrix, index=categories, columns=categories)
GPT-4プロンプト 回答 from Orange.data.pandas_compat import table_from_frame # Orange.data.Tableへの変換 out_data = table_from_frame(df_cm) 前は存在しないとGPT-4が回答していたデータフレームからTableへの変換コードを書いている。
混同行列表示 混同行列
タスク3,4でのChatGPT利用 ⑦人の指示 ⑤ Python Script widgetのコンソー ルパネルのエラー 確認 ① プロンプト/ エラー報告 ⑥ ② ④ Python Script ChatGPTの回答 widgetの実行 ③ Python Script widgetのエ ディタパネルへコピー 人の指示が多少おかしく てもなんとかなる。
Python script 3.03dos_clustering_cls_score.owsのPython Script widget中と {prefix}/python/3.04.GPT4.py 保存。
目次 タスク1:ChatGPTを利用したベクトルデータの次元変換Python widgetの作成 タスク1’: ChatGPTを利用したカラム名を利用したデータ選択とベクトルデータの次元変換Python widgetの作成 タスク2:交差検定でDOSのセミコア元素分類logistic回帰予測モデルとクラスタリング タスク3:semicoreカラムとClusterカラムから“分類性能”を評価するPython widgetの作成 タスク4:semicoreカラムとClusterカラムから“混同行列”を評価するPython widgetの作成 タスク5:タスク2の解析を行うPythonコードをChatGPTで作成。
線形係数(再) タスク2Aで用いた2.03.cls_CV.ows Lasso (L1), C=4 係数0が多く,説明変数のごく一 部の特徴量で分類している。 =この説明変数で,各semicoreの” 特徴”を表している。
DOSと分類係数を関連付けた可視化 目的:回帰モデルの重要な説明変数を可視化する。 完成予定図 手段:GPT4で生成したPythonコードをjupyter labで実行しながら 完成させる。 ① ファイル: データファイル:“{prefix}/data/hea4_dos_selected_Orange.csv” 係数ファイル:“{prefix}/data_generated/dos_cls_coefficients.csv” 。 作業: ①データファイルのsemicore元素をN vs log10_dosNの図を書く。 ②係数ファイルに対して,N vs log10_dosN(係数)の図を書く。 ③上の2つの図を上下に並べる。 ② ③
タスク5 タスク4と同様にプロンプトを部分毎に書いて部分毎のコードを作成 して人がまとめます。
タスク5 以下の過程を行う。 ③ 可視化図 ① データファイル 加工 可視化図 上パネル ② 係数ファイル 加工 可視化図 下パネル
データファイルの確認 エクセルによるデータファイルの表示 Orange用
データファイルの確認 ③x(横軸の 値)の追加 ②転置 Sn,V| Mn|Sn |Pt ①2,3行目の削除 Sn,Mn|Fe |Cd|Sm Sn,Ti|Mn |Ni|Sn … x Log10_dos1 1 Log10_dos3 3 Log10_dos5 5 Log10_dos7 7 … Log10_dos99 99
GPT-4プロンプト 回答コード # pandasというデータ操作に便利なライブラリをインポートします。 import pandas as pd import numpy as np # 関数を定義します。この関数は、データファイルのパスを引数として受け取ります。 def process_data(file_path): プロンプト 以下のPythonコードを書いてください。 私はPythonの初心者なの で私が理解できるようにソースコードに説明を追加してください。 以下の作業を行ってください。 1. データファイル名を“../data/hea4_dos_selected_Orange.csv”と してます。データファイルをデータフレーム df_dataとして読 み込みます。データファイルの最初の行を1行目として2行 目と3行目は読み飛ばしてください。 2. selected_semicore変数を”Bi”としてください。 dfからsemicore カラムがsemicoreであるデータを選択してください 3. log10_dos1,log10_dos3,log10_dos5,...,log10_dos99までのカラム を選択してください。選択部分の行列を転置してください。 4. dos10_dosNのNに対応する1,3,5,…,99を新たなカラムxに追加し てください。 5. ここまで行う関数を引数をデータファイルとして作成してく ださい。 不明事項は私に質問してください。 赤字部分:誤り。 # pandasのread_csv関数を使ってCSVファイルを読み込みます。 # skiprowsパラメータで2行目と3行目を読み飛ばします。 df_data = pd.read_csv(file_path, skiprows=[1,2]) ←skiprowsを間違える場合あり。 # selected_semicore変数を定義します。 selected_semicore = "Bi" # dfからsemicoreカラムがselected_semicoreと一致するデータを選択します。 df_selected = df_data[df_data['semicore'] == selected_semicore] # 選択したいカラムの名前を作成します。 selected_columns = ['log10_dos' + str(i) for i in range(1, 100, 2)] # selected_columnsに含まれるカラムだけを選択します。 df_selected = df_selected[selected_columns] # 行列を転置します。転置により、元々のカラムが行に、行がカラムになります。 df_transposed = df_selected.transpose() # "x"カラムを作成します。これは元々のカラム名(log10_dosN)のN部分に相当します。 df_transposed['x'] = [int(column.split('log10_dos')[1]) for column in df_transposed.index] # 転置したデータフレームを返します。 return df_transposed # この関数を呼び出し、結果を表示します。 result = process_data("../data/hea4_dos_selected_Orange.csv") print(result)
GPT-4プロンプトと回答 (可視化ができることの確認) プロンプト 上のresultを用いて図を書きます。 1. 横軸をxカラムの値,縦軸をxカラム 以外としてください。 2. 図は黒色のみ用いてください。図 で線の透過性を表すアルファ値を 0.05としてください。 回答 # 必要なライブラリをインポートします。 import matplotlib.pyplot as plt # matplotlibを使ってグラフを描きます。 # xカラムをx軸に、それ以外のカラムをそれぞれy軸としてプロットします。 for column in result.columns: if column != 'x': plt.plot(result['x'], result[column], color='black', alpha=0.05) # グラフの表示 plt.show() 可視化完了
タスク5 以下の過程を行う。 ③ 可視化図 ① データファイル 加工 可視化図 上パネル ② 係数ファイル 加工 可視化図 下パネル
係数ファイル エクセルによる表示。[Preprocess]で正規化を行っていたら正規化後の係数。 ② X ① 1 3 5 . . . ①データファイルを読み 込む。その際にデータ ファイルの2,3行目を 読み飛ばす。 ②xカラムを加える。
GPT-4プロンプトと回答 回答 プロンプト 以下のPythonコードを書いてください。 私はPythonの 初心者なので私が理解できるようにソースコードに説 明を追加してください。 以下の作業を行ってください。 1. 係数ファイル名を “../data_generated/dos_cls_coefficients.csv”とします。 係数ファイルをデータフレーム df_coefとして読み 込みます。ファイルは1行目から始まるとして,2 行目と3行目は読み飛ばしてください。 2. selected_semicore変数を”Bi”としてください。 log10_dos1,log10_dos3,log10_dos5,...,log10_dos99ま でのリストを作成してください。 3. nameカラムが上のリストの行を選択しててくださ い。 4. dos10_dosNのNに対応する1,3,5,…,99をカラムxに追 加してください。 5. x軸をxカラム,y軸カラム名がselected_semicoreであ るデータとして図示してください。 不明事項は私に質問してください。 赤字部分:誤り。 # 必要なライブラリをインポートします。 import pandas as pd import matplotlib.pyplot as plt # 関数を定義します。この関数は、係数ファイルのパスを引数として受け取ります。 def plot_coefficients(file_path): # pandasのread_csv関数を使ってCSVファイルを読み込みます。 # skiprowsパラメータで2行目と3行目を読み飛ばします。 df_coef = pd.read_csv(file_path, skiprows=[1,2]) # selected_semicore変数を定義します。 selected_semicore = "Bi" # 選択したいカラムの名前を作成します。 selected_columns = ['log10_dos' + str(i) for i in range(1, 100, 2)] # nameカラムがselected_columnsに含まれる行を選択します。 df_selected = df_coef[df_coef['name'].isin(selected_columns)] # "x"カラムを作成します。これは元々のカラム名(log10_dosN)のN部分に相当します。 df_selected['x'] = [int(name.split('log10_dos')[1]) for name in df_selected['name']] # matplotlibを使ってグラフを描きます。 # xカラムをx軸に、selected_semicoreカラムをy軸にしてプロットします。 plt.plot(df_selected['x'], df_selected[selected_semicore]) # グラフの表示 plt.show() # この関数を呼び出し、結果を表示します。 plot_coefficients("../data_generated/dos_cls_coefficients.csv")
GPT-4プロンプトと回答 回答 プロンプト 上のコードを実行したところ df_selected['x'] = [int(name.split('log10_dos')[1]) for name in df_selected['name’]] でA value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead というメッセージが出たのでコードを修正してください。 # 必要なライブラリをインポートします。 import pandas as pd import matplotlib.pyplot as plt # 関数を定義します。この関数は、係数ファイルのパスを引数として受け取ります。 def plot_coefficients(file_path): # pandasのread_csv関数を使ってCSVファイルを読み込みます。 # skiprowsパラメータで2行目と3行目を読み飛ばします。 df_coef = pd.read_csv(file_path, skiprows=[1,2]) # selected_semicore変数を定義します。 selected_semicore = "Bi" # 選択したいカラムの名前を作成します。 selected_columns = ['log10_dos' + str(i) for i in range(1, 100, 2)] # nameカラムがselected_columnsに含まれる行を選択します。 df_selected = df_coef[df_coef['name'].isin(selected_columns)].copy() # コピーを作成 # "x"カラムを作成します。これは元々のカラム名(log10_dosN)のN部分に相当します。 df_selected.loc[:, 'x'] = [int(name.split('log10_dos')[1]) for name in df_selected['name']] # matplotlibを使ってグラフを描きます。 # xカラムをx軸に、selected_semicoreカラムをy軸にしてプロットします。 plt.plot(df_selected['x'], df_selected[selected_semicore]) # グラフの表示 plt.show() # この関数を呼び出し、結果を表示します。 plot_coefficients("../data_generated/dos_cls_coefficients.csv")
GPT-4プロンプトと回答 ② ① プロンプト selected_rowsの図を棒グラフにしてくださ い。その際にy軸が0の位置に直線を引い てください。 # 必要なライブラリをインポートします。 import pandas as pd import matplotlib.pyplot as plt # 関数を定義します。この関数は、係数ファイルのパスを引数として受け取ります。 def plot_coefficients(file_path): # pandasのread_csv関数を使ってCSVファイルを読み込みます。 # skiprowsパラメータで2行目と3行目を読み飛ばします。 df_coef = pd.read_csv(file_path, skiprows=[1,2]) # selected_semicore変数を定義します。 selected_semicore = "Bi" # 選択したいカラムの名前を作成します。 selected_columns = ['log10_dos' + str(i) for i in range(1, 100, 2)] # nameカラムがselected_columnsに含まれる行を選択します。 df_selected = df_coef[df_coef['name'].isin(selected_columns)].copy() # コピーを作成 ③図 # "x"カラムを作成します。これは元々のカラム名(log10_dosN)のN部分に相当します。 df_selected.loc[:, 'x'] = [int(name.split('log10_dos')[1]) for name in df_selected['name']] # matplotlibを使って棒グラフを描きます。 # xカラムをx軸に、selected_semicoreカラムをy軸にしてプロットします。 plt.bar(df_selected['x'], df_selected[selected_semicore]) 可視化完了 # y=0の位置に直線を引きます。 plt.axhline(0, color='black') # グラフの表示 plt.show() # この関数を呼び出し、結果を表示します。 plot_coefficients("../data_generated/dos_cls_coefficients.csv")
タスク5 以下の過程を行う。 ③ 可視化図 ① データファイル 加工 可視化図 上パネル ② 係数ファイル 加工 可視化図 下パネル
GPT-4プロンプトと回答 プロンプト データフィルに対する図を上,係数ファイルに対す る図を下に配置した一つの図にするコードを書いて ください。 データファイル名,係数ファイル名, selected_semicoreを引数として図を書く関数を作成し てください。 回答 # 必要なライブラリをインポートします。 import pandas as pd import matplotlib.pyplot as plt import numpy as np # データフレームから特定のデータを選択し、新しいカラムを追加する関数 def process_data(df, selected_semicore): # selected_semicoreで指定したデータを選択します。 df_selected = df[df['semicore'] == selected_semicore] # "log10_dos1", "log10_dos3", ..., "log10_dos99"という名前のカラムを選択します。 df_selected = df_selected.filter(regex='log10_dos[13579]') # DataFrameを転置します。 df_transposed = df_selected.T # "dos10_dosN"の"N"に対応する1, 3, 5, ..., 99を新たなカラム"x"に追加します。 df_transposed['x'] = [int(column.split('log10_dos')[1]) for column in df_transposed.index] return df_transposed 回答(つづき) # 関数を定義します。この関数は、データファイルと係数ファイルのパス、及びselected_semicoreを引数として受け 取ります。 def plot_data_and_coefficients(data_file_path, coef_file_path, selected_semicore): # データファイルを読み込みます。 df_data = pd.read_csv(data_file_path, skiprows=[1,2]) df_data_transposed = process_data(df_data, selected_semicore) # 係数ファイルを読み込みます。 df_coef = pd.read_csv(coef_file_path, skiprows=[1,2]) df_coef_selected = df_coef[df_coef['name'].isin(df_data_transposed.index)].copy() df_coef_selected.loc[:, 'x'] = [int(name.split('log10_dos')[1]) for name in df_coef_selected['name']] # matplotlibを使って図を作成します。subplotを使って2つのグラフを一つの図に配置します。 fig, ax = plt.subplots(2, 1) # データファイルに対する図を上に配置します。 for i in range(len(df_data_transposed.columns) - 1): ax[0].plot(df_data_transposed['x'], df_data_transposed.iloc[:, i], color='black', alpha=0.05) # 係数ファイルに対する図を下に配置します。 ax[1].bar(df_coef_selected['x'], df_coef_selected[selected_semicore]) ax[1].axhline(0, color='black') # グラフの表示 plt.show() # この関数を呼び出し、結果を表示します。 plot_data_and_coefficients("../data/hea4_dos_selected_Orange.csv", "../data_generated/dos_cls_coefficients.csv", "Bi")
可視化結果 ①よく見ると先程と図が違う。 先程の図 ③先程までできていた箇所をなぜか df_selected = df_selected.filter(regex='log10_dos[13579]’) と誤って書き直している。 ④dos10_dosNをlog10_dosNと読み替えることはできていま すが,プロンプトの「 dos10_dosNのNに対応する1,3,5,…,99 をカラムxに追加してください。」にうまく対応できない。 ②今回の図の上パネル部分
GPT-4プロンプトと回答 回答 人が介入し,カラム選択法を変えるよう プロンプトを書く。 def process_data(df, selected_semicore): # selected_semicoreで指定したデータを選択します。 df_selected = df[df['semicore'] == selected_semicore] # "log10_dos"を含む名前のカラムを選択します。 df_selected = df_selected.loc[:, df_selected.columns.str.contains('log10_dos')] プロンプト "log10_dos"を含む文字列のカラムを 用いるとしてprocess_data関数を書き 換えてください。 # DataFrameを転置します。 df_transposed = df_selected.T # "dos10_dosN"の"N"に対応する数値を新たなカラム"x"に追加します。 df_transposed['x'] = [int(column.split('log10_dos')[1]) for column in df_transposed.index] return df_transposed
GPT-4プロンプトと回答
プロンプト
図のタイトルをselected_semicore変数の値
としてください。図をファイルに保存し
てください。ファイル名は
selected_semicore+"_cls_coef.png"とします。
回答
# 必要なライブラリをインポートします。
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# データフレームから特定のデータを選択し、新しいカラムを追加する関数
def process_data(df, selected_semicore):
# selected_semicoreで指定したデータを選択します。
df_selected = df[df['semicore'] == selected_semicore]
# 関数を定義します。この関数は、データファイルと係数ファイルのパス、及びselected_semicoreを引数として受け
取ります。
def plot_data_and_coefficients(data_file_path, coef_file_path, selected_semicore):
# データファイルを読み込みます。
df_data = pd.read_csv(data_file_path, skiprows=[1,2])
df_data_transposed = process_data(df_data, selected_semicore)
# 係数ファイルを読み込みます。
df_coef = pd.read_csv(coef_file_path, skiprows=[1,2])
df_coef_selected = df_coef[df_coef['name'].isin(df_data_transposed.index)].copy()
df_coef_selected.loc[:, 'x'] = [int(name.split('log10_dos')[1]) for name in df_coef_selected['name']]
# matplotlibを使って図を作成します。subplotを使って2つのグラフを一つの図に配置します。
fig, ax = plt.subplots(2, 1)
# タイトルを追加します。タイトルはselected_semicoreの値にします。
fig.suptitle(selected_semicore)
追加された
# データファイルに対する図を上に配置します。
for i in range(len(df_data_transposed.columns) - 1):
ax[0].plot(df_data_transposed['x'], df_data_transposed.iloc[:, i], color='black', alpha=0.05)
# "log10_dos"を含む名前のカラムを選択します。
df_selected = df_selected.loc[:, df_selected.columns.str.contains('log10_dos')]
# 係数ファイルに対する図を下に配置します。
ax[1].bar(df_coef_selected['x'], df_coef_selected[selected_semicore])
ax[1].axhline(0, color='black')
# DataFrameを転置します。
df_transposed = df_selected.T
# グラフをPNGファイルとして保存します。ファイル名はselected_semicore+"_cls_coef.png"にします。
plt.savefig(f"{selected_semicore}_cls_coef.png")
# "dos10_dosN"の"N"に対応する数値を新たなカラム"x"に追加します。
df_transposed['x'] = [int(column.split('log10_dos')[1]) for column in
df_transposed.index]
return df_transposed
追加された
# グラフの表示
plt.show()
# この関数を呼び出し、結果を表示します。
plot_data_and_coefficients("../data/hea4_dos_selected_Orange.csv", "../data_generated/dos_cls_coefficients.csv", "Bi")
GPT-4プロンプトと回答 最後に,全てのsemicore元素に対して図 を書く。 毎回コードを全部書き換えようとする場 合があるので,完成している関数をその まま使うように指示する。 プロンプト df[“semicore”]の重複しない全ての値に 対して関数plot_data_and_coefficientsを 呼んで図を作成してください。 関数plot_data_and_coefficientsは再表示 しないでください。 dfという変数ははじめにデータファイ ルに対して用いた変数。現在の会話で はすでに使われなくなった変数。 そのsemicoreカラムから重複しない全 ての値を取得するようにコードを作成。 回答 # データファイルを読み込みます。 df = pd.read_csv("../data/hea4_dos_selected_Orange.csv", skiprows=[1,2]) # "semicore"カラムの一意な値を取得します。 unique_semicore_values = df["semicore"].unique() # 一意な値それぞれに対して、plot_data_and_coefficients関数を呼 び出します。 for semicore_value in unique_semicore_values: plot_data_and_coefficients("../data/hea4_dos_selected_Orange.csv", "../data_generated/dos_cls_coefficients.csv", semicore_value) エラーが発生せず,六元素semicoreの図を全て書けた。
DOSと線形モデル係数の可視化結果 Hf Hg Mo ①確率が逆にな るようにほぼ同 じ位置の係数が 選ばれている。 Nb Bi ②確率が逆にな るようにほぼ同 じ位置の係数が 選ばれている。 人間にとっては一見理解できない判定方法が多い, このデータに対してlogistic回帰はこれらの特徴量が妥当と判断した。 ③Biのピーク は見ていない。 Sn ④この位置の 大きさで比較 している。
DOS ①今回のロジスティック回帰では各𝑥𝑥に対する𝑦𝑦の値を説明変数。 ②人は値そのものの比較は苦手なので,凹凸の位置で判断。 ④ ③ 全体が右肩上がり vs 下がって上がる。 左に肩, 右にくぼみがあ るかどうか ⑤ 凸構造,肩構造 の位置が異なる。 ⑤凹凸の位置というのは各𝑥𝑥に対する𝑦𝑦の値でなく,𝑥𝑥の変化に対する𝑦𝑦の値の変化。 ⑥人の感覚とロジスティック回帰の重要な特徴が異なるのは説明変数のせい。
Python script 3.05.GPT-4.ipynbとして保存
注意(attention) 今の結果は六元素の場合の分類モデルに限る話です。他の元素が入るとまた異 なるでしょう。 機械学習モデルの重要な特徴量を人が分かりやすくする試みが多数あります。 参考文献: arXiv:1905.03540v4, Mitsubara, “Embedding Human Knowledge into Deep Neural Network via Attention Map” arXiv:2101.05307v2, Eloi Zablocki et al., “Explainability of deep vision-based autonomous driving systems: Review and challenges”
一つにまとめたタスク5プロンプト さらに,y軸をsemicoreによらず統一する,も行う。 プロンプト 以下のPythonコードを書いてください。 私はPythonの初心者なので私が理解できるようにソースコードに説明を追加してください。 以下の作業を行ってくだ さい。 データフィルに対する図を書く関数を作成してください。 データファイル名とselected_semicore変数があります。 データファイルをデータフレーム df_dataとして読み込みます。データファイルの最初の行を1行目として2行目と3行目は読み飛ばしてください。 dfからsemicoreカラムがselected_semicoreである行を選択します。更に,文字log10_dosを含むカラムを選択してください。そして選択部分の行列を転置して ください。 log10_dosを含む文字でlog10_dosの除いた文字を整数値になおしてカラムxに追加してください。 上の結果を用いて図を書きます。 横軸をxカラムの値,縦軸を文字列log10_dosを含む全てのカラムの値としてください。 図は黒色のみ用いてください。図で線の透過性を表すアルファ値を0.05としてください。 図のlegendは消してください。 何度か行いよくある間違い: ある部分を完全に行わない。 係数ファイルに対する図を書きます。 係数ファイル名とselected_semicore変数があります。 係数ファイルをデータフレーム df_coefとして読み込みます。ファイルは1行目から始まるとして,2行目と3行目は読み飛ばしてください。 nameカラムが文字列log10_dosを含む行を選択します。 このうち文字がlog10_dos文字列を含む行のみを選択します。 nameカラムはlog10_dosを含む文字列を撮ります。log10以外を整数値に変換してカラムxに追加してください。 x軸をxカラム,y軸カラム名がselected_semicoreであるデータとして図示してください。 この図を棒グラフにしてください。その際にy軸が0の位置に直線を引いてください。 データファイルのデータをsemicoreで 選択して,転置して,再びsemicoreで 二重に選択しようとする。 データファイルに対する図を上,係数ファイルに対する図を下に配置した一つの図にする関数を書いてください。 データファイル名,係数ファイル名,selected_semicoreを引数とします。 図全体のタイトルをselected_semicore変数の値としてください。 データファイル名を“../data/hea4_dos_selected_Orange.csv”としてます。 係数ファイル名を“../data_generated/dos_cls_coefficients.csv”とします。 selected_semicore変数は文字列で,Bi,Hf,Hg,Mo,Nb,Snの値をとります。 図をファイルに保存してください。ファイル名はselected_semicore+"_cls_coef.png"とします。 それぞれののデータフィルに対する図でselected_semicoreに依存せずに縦軸の範囲を揃えてください。log10_dosを含むカラムで数値を含む行から最小値,最 大値を取得してください。 それぞれの係数に対する図でselected_semicoreに依存せずに縦軸の範囲を揃えてください。log10_dosを含む行のBi,Hf,Hg,Mo,Nb,Snカラムから最小値,最大値 を取得してください。 データファイルのy軸を一つだけ図示 する。 selected_semicore変数は文字列で,Bi,Hf,Hg,Mo,Nb,Snに対して全ての図を書いてください。 不明事項は私に質問してください。
今回行ったこと ChatGPTと会話をして • Python widget内コードを書く例 • Pythonコードを書く例 を紹介した。 プログラミングにおいてChatGPTは X ライブラリのドキュメント(多分正しい)を参照する O 機械学習なので多数決で「標準化」された世界 に従ってもっともらしいコードを回答。 ChatGPTは「もっともらしい嘘をつく(誤りがある)」と言われることが多いのですが,100%正し いと思うほうがむしろどうかしています。 誤りがあるのは人も同じ。人の誤りに対してもChatGPTは対応する。 人側に知識があれば,ChatGPTはとても使えるツールです。
最後に Orangeは特に可視化がとても強力なソフトです。 回帰モデルを簡単に複数並べて評価指標を並べて表示できることもとても有用です。 データが全く分からないときに私もこのソフトを用います。 例えば,Python Script widgetでベイズ最適化を作成すると,Orange自体の強力な可視化機能 と合わせてとても有用と思います。ベイズ最適化はscikit-learnを用いると簡単に実装できま す。例えば私のPython連続セミナーにコードがあります。ご興味がある方はChatGPTに支援 してもらいPython Script widgetに組み込んでみてください。
以上です。 お疲れ様でした。
補足 経験では なるべく正確に。 対応できる例を示したが,二重の対応は難しい。 例)dos10_dosNをlog10_dosNと読み替えることはできるが, 同時に他の部分のN=1,3,5,…,99であることを理解するのは難しい。 部分毎に分けて。 (不正確を念頭に置く)人が想定したコードとは異なるコードを書く,また,大量のプ ロンプトがあると大量のコードが出力されるので,エラー箇所把握が困難。 他の箇所の指示と混乱する。一部分を完全に忘れる。
ChatGPTを利用したプログラミング学習 学習として有用な例)out_dataへの変換 domain = Domain([ContinuousVariable(f'feature{i+1}') for i in range(n)]) out_data = Table.from_numpy(domain, matrix_data) GPT-4はこの変換方法を使う場合が多かった。 人件費が高い。 時間がかかる。 聞ける人が いない。 Domain情報 教師 自習 全ドキュメン トを読み理解 する。 in_dataの変換時も同様にDomain情報を用いる。 例)metadataを含めるように指示しないと説明変数, 目的変数のみを変換する。 Github issues は活発では ない。 out_dataへの 変換法を知る。 ChatGPT 安価に 短時間に 容易に 人 out_dataへの 変換法を教え てもらう。 ChatGPTは誤りがあっ てもまだ有用。
プログラミングにおけるChatGPTの利用 Google検索 「ページランク」で検索結果を並べるので キーワードでの調べ物が短時間に行えるよう になった。 →google検索で行う・行わない人の差が大きい。 回答の正確性は検索エンジン側の問題でない 懸念:検索そして,実際のアクセス情報を解析する と何をしているのか分かる。 →現在,大手検索エンジンでのインタネット検 索を使わない人は現在ほぼいない。 GPT-4 Pythonを知らない→GPT-4を用いてPythonを短 時間に学ぶ Python初心者→GPT-4を用いて知らないライブ ラリを短時間に学ぶ。 Python中級者→GPT-4を用いて大量のコードを 短時間に生成する。GPT-3.5により質より量で 良いかもしれない。 →GPT-4を使う人・使わない人の差 が大きくなる。 もう利用できるので,安全性の問題や回答が正確で ない問題はあっても使わないわけにはいかない。 安全性に対してはオプトアウトすること。
プログラミングにおけるChatGPTの利用 ① Pythonの知識 + インフォマティ クスの知識 ② データ解析のPythonコードを書くには? ③ GPT-4でも100%正しくない 人が誤りを発見できるだけの知識がある。 →コード作成ができる,コード作成が高速化する。
プログラミングにおけるChatGPTの利用 ① Pythonの知識 + インフォマティ クスの知識 + Orangeクラス の知識 ② Python widgetのPythonコードを書くには? ③ Orangeクラスの知識はかなり狭い専門領域知識でほとんどの人は知らない。 しかし,GPT-4は知っている。 ChatGPTで(少し間違っていても)Orangeクラスの知識を支援してもらえれば Orangeクラスの学習が容易になる。 ④ 人がGPT-4の誤りを発見できるだけの知識を持つようになる。 GPT-4のコードを人がチェックできるようになるので, Python widgetのPythonコード作成が高速化する。
プログラミング学習 あなたの知識 Keras データ解析学 PyTorch Orange Scikit-learn matplotlib 回答 ChatGPT scipy (不正確な家庭教師) numpy Python 誤りが分かる程度に学習 プロンプト プログラミングの場合は実行させて 正常な動作か分かることが多い。 プログラミング学習の効率はかなり 良いはず。