Python プログラミング アシスタントとしての ChatGPT


UnsplashのSigmundによる元の画像| 著者による編集

OpenAI の ChatGPT は…ご存知のとおりです。 あなたはそれについて十分に読んだので、紹介はもう必要ありません。 たまたま いいえ ChatGPT とは何かを知り、最初にこれを見てから、戻って続行してください。

ChatGPT との会話は楽しく、啓発的ですらあります。 しかし、それが実際にどれほど役立つかを見てみましょう。

私たちが提供する仕様からいくつかのコードを書くことに関して、ChatGPT ができることを見てみましょう。 シンプルに始めて、そこから構築していきます。

なんらかのデータ処理スクリプトから始めるのがよいと思いました。 その後、さまざまな Python ライブラリを使用して、ChatGPT にいくつかの機械学習スクリプトを作成させるつもりなので、これは開始するのに妥当な場所のように思えました。

目標

まず、データセットの読み込みを試みたいと思いました。 すべてのデータセット値が数値であることを確認するか、数値に変換します。 欠損値のチェック; データセットをトレーニング セットとテスト セットに分割します。

プロンプト

次のことを行う Python スクリプトを作成します。
– ディスク上の csv からデータセットを Pandas DataFrame に読み込みます
– データセットが完全に数値であることを保証します。 文字列値を数値に変換し、後で参照するために辞書でこの変換を追跡します
– DataFrame の欠損値をチェックし、欠損値が 1 つあるすべてのレコードに欠損値を代入します。 複数の欠損値を持つレコードを完全に削除する
– データセットをテスト セットとトレーニング セットに分割します

応答

import pandas as pd

# Load dataset from csv to DataFrame
df = pd.read_csv('dataset.csv')

# Initialize dictionary to track string to numeric conversions
conversions = {}

# Convert string values to numeric and track conversions in dictionary
for col in df.columns:
    if df[col].dtype == object:
        conversions[col] = {val: i for i, val in enumerate(df[col].unique())}
        df[col] = df[col].map(conversions[col])

# Check for missing values
missing_values = df.isna().sum()

# Impute missing values for records with one missing value
for col in missing_values[missing_values == 1].index:
    df[col].fillna(df[col].median(), inplace=True)

# Drop records with more than one missing value
df.dropna(thresh=len(df.columns) - 1, inplace=True)

# Split dataset into test and training sets
from sklearn.model_selection import train_test_split
train_df, test_df = train_test_split(df, test_size=0.2)

注: スクリプトは、csv ファイル名 “dataset.csv” からデータセットを読み込み、データフレームを 80/20 の比率でテスト セットとトレーニング セットに分割します。 別のファイル名または比率を使用する場合は、それに応じてパス/比率を変更します。

解析

ChatGPT は便利なスクリプトを作成しました。 データセット名と、トレーニング/テスト分割の割合を決定し、これらのポイントと、必要に応じてそれらを変更する方法を記録しました。 概ね、ミッションコンプリート。

目標

何かを実行するスクリプトができたので、少しリファクタリングしましょう。 優れたコーディングの基本は、関数を使用してコードを論理的に整理し、再利用を促進し、同じことを繰り返さないようにすることです。

プロンプト

上記のスクリプトを書き直して、意​​味のある一連の関数を使用します

応答

import pandas as pd
from sklearn.model_selection import train_test_split

def load_and_convert_data(file_path):
    # Load dataset from csv to DataFrame
    df = pd.read_csv(file_path)
    
    # Initialize dictionary to track string to numeric conversions
    conversions = {}
    
    # Convert string values to numeric and track conversions in dictionary
    for col in df.columns:
        if df[col].dtype == object:
            conversions[col] = {val: i for i, val in enumerate(df[col].unique())}
            df[col] = df[col].map(conversions[col])
    
    return df, conversions

def handle_missing_values(df):
    # Check for missing values
    missing_values = df.isna().sum()
    
    # Impute missing values for records with one missing value
    for col in missing_values[missing_values == 1].index:
        df[col].fillna(df[col].median(), inplace=True)
    
    # Drop records with more than one missing value
    df.dropna(thresh=len(df.columns) - 1, inplace=True)
    
    return df

def split_data(df, test_size):
    return train_test_split(df, test_size=test_size)

# Use the functions
file_path = "dataset.csv"
df, conversions = load_and_convert_data(file_path)
df = handle_missing_values(df)
train_df, test_df = split_data(df, 0.2)

ここでは、次の 3 つの関数を使用しました。

1. load_and_convert_data(file_path) は csv データセットを読み込み、文字列値を数値に変換します。
2. handle_missing_values(df) は、データセット内の欠損値を処理します。
3. split_data(df, test_size) は、データセットをテスト セットとトレーニング セットに分割します。

メイン スクリプトは、これらの関数を使用して、データセットの読み込み、変換、クリーニングを行い、テスト セットとトレーニング セットに分割します。

データセットのパスとテスト比率は、これらの関数の入力です。

解析

ChatGPT によって出力された最初のスクリプトを見ると、どの機能が機能に分割されるかについて、かなり明白な線が引かれていることがわかるでしょう。 私は確かにそうしました。 この点で、ChatGPT はまさに私が期待していたことを実行しました。 ここでも、有能なスクリプトが生成されました。

目標

オーケー、編成のためにいくつかの関数を使用するようになったので、スクリプトは少し見栄えが良くなりました。 次に、スクリプトを少し拡張して、スクリプトの実行中にユーザーがいくつかのパラメーターを指定できるようにします。

プロンプト

上記のプログラムを書き直して、コマンド ラインから以下を引数の形式で要求し、それらをプログラムで使用します。
– データセット csv ファイルのパス/名前
– トレーニング/テストの分割サイズ
– 欠落した値を代入する代わりに、削除するレコードごとの欠落した値の数のしきい値。その後、レコード全体を削除します。

応答

import pandas as pd
import argparse
from sklearn.model_selection import train_test_split

def load_and_convert_data(file_path):
    # Load dataset from csv to DataFrame
    df = pd.read_csv(file_path)
    
    # Initialize dictionary to track string to numeric conversions
    conversions = {}
    
    # Convert string values to numeric and track conversions in dictionary
    for col in df.columns:
        if df[col].dtype == object:
            conversions[col] = {val: i for i, val in enumerate(df[col].unique())}
            df[col] = df[col].map(conversions[col])
    
    return df, conversions

def handle_missing_values(df, threshold):
    # Check for missing values
    missing_values = df.isna().sum()
    
    # Impute missing values for records with one missing value
    for col in missing_values[missing_values == 1].index:
        df[col].fillna(df[col].median(), inplace=True)
    
    # Drop records with more than threshold missing value
    df.dropna(thresh=len(df.columns) - threshold, inplace=True)
    
    return df

def split_data(df, test_size):
    return train_test_split(df, test_size=test_size)

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument("file_path", help="path/name of the dataset csv file")
    parser.add_argument("test_size", help="train/test split size", type=float)
    parser.add_argument("threshold", help="threshold for the number of missing values per record", type=int)
    args = parser.parse_args()
    
    # Use the functions
    df, conversions = load_and_convert_data(args.file_path)
    df = handle_missing_values(df, args.threshold)
    train_df, test_df = split_data(df, args.test_size)

このバージョンでは、argparse モジュールを使用して、ファイル パス、テスト/トレーニングの分割サイズ、およびレコードごとの欠損値の数のしきい値をコマンド ライン引数として入力しました。 ユーザーは、次のように正しい引数を使用してスクリプトを実行する必要があります。

python script.py dataset.csv 0.2 1

これにより、「dataset.csv」ファイル、test_size 0.2、欠損値のしきい値 1 を使用してスクリプトが実行されます。

メイン スクリプトは、関数でこれらの引数を使用してデータセットを読み込み、変換し、クリーンアップしてから、テスト セットとトレーニング セットに分割します。

また、スクリプトを実行するときは、スクリプトを IDE から実行するのではなく、コマンド ラインから実行する必要があることにも注意してください。

解析

正直なところ、ChatGPT の機能が非常にうまく説明されていることを考えると、ここではあまり分析する必要はありません。 実際にここで、以前は気がつかなかったことに注意し、ChatGPT のコメントが表現力豊かで簡潔であることを評価します。

目標

ここで、このコードを「本番」に対応させたいとしましょう (冗談です)。 Streamlit アプリでこれらの関数をラップするように ChatGPT を取得しましょう。

プロンプト

上記のプログラムを Streamlit アプリとして書き直して、ユーザーが上記のコマンド ライン引数と同じ引数を指定できるようにします。

応答

import pandas as pd
import streamlit as st
from sklearn.model_selection import train_test_split

def load_and_convert_data(file_path):
    # Load dataset from csv to DataFrame
    df = pd.read_csv(file_path)
    
    # Initialize dictionary to track string to numeric conversions
    conversions = {}
    
    # Convert string values to numeric and track conversions in dictionary
    for col in df.columns:
        if df[col].dtype == object:
            conversions[col] = {val: i for i, val in enumerate(df[col].unique())}
            df[col] = df[col].map(conversions[col])
    
    return df, conversions

def handle_missing_values(df, threshold):
    # Check for missing values
    missing_values = df.isna().sum()
    
    # Impute missing values for records with one missing value
    for col in missing_values[missing_values == 1].index:
        df[col].fillna(df[col].median(), inplace=True)
    
    # Drop records with more than threshold missing value
    df.dropna(thresh=len(df.columns) - threshold, inplace=True)
    
    return df

def split_data(df, test_size):
    return train_test_split(df, test_size=test_size)

def main():
    st.set_page_config(page_title="Data Preprocessing", page_icon=":guardsman:", layout="wide")
    st.title("Data Preprocessing")
    
    file_path = st.text_input("Enter the path/name of the dataset csv file: ")
    test_size = st.number_input("Enter the train/test split size (decimal between 0 and 1): ", step=0.01, value=0.2)
    threshold = st.number_input("Enter the threshold for the number of missing values per record: ", step=1, value=1)
    
    if st.button("Process Data"):
        df, conversions = load_and_convert_data(file_path)
        df = handle_missing_values(df, threshold)
        train_df, test_df = split_data(df, test_size)
        st.success("Data preprocessing completed!")

if __name__ == '__main__':
    main()

このバージョンは、ユーザーがコマンドライン引数と同じ引数を指定できるようにする Streamlit アプリです。 Streamlit ライブラリを使用して、ユーザーがファイル パス、テスト/トレーニングの分割サイズ、およびレコードごとの欠損値の数のしきい値を入力できるインタラクティブな Web アプリを作成します。 ユーザーは、[データの処理]ボタンをクリックしてスクリプトを実行し、データを前処理することができます。 以前のバージョンのスクリプトと同じ関数を使用して、データセットの読み込み、変換、クリーニングを行い、テスト セットとトレーニング セットに分割します。

スクリプトを実行するには、Streamlit がインストールされている必要があります。ターミナルでコマンド pip install streamlit を実行できます。 インストールしたら、コマンドでスクリプトを実行します streamlit run script.py.

解析

それはやるべきことをやった。 ChatGPT は、機能している… 関数を使用して、シンプルな Streamlit Web アプリを構築しました。

ChatGPT によって生成されたスクリプトで作成された Streamlit Web アプリのスクリーンショット
ChatGPT によって生成されたスクリプトで作成された Streamlit Web アプリ

ChatGPT は、私たちが提供した仕様に基づいて、作成、リファクタリング、拡張、および単純なデータ前処理 Python スクリプトのラッパーを追加するという完璧な仕事をしてくれました。 これは決して最も複雑なプログラムではありませんでしたが、プログラミング アシスタントとして機能することで、ChatGPT を真に役立つものにする方向への第 1 歩でした。 結果は各ステップで目標を達成しました。

次回は、複雑さが増し、要件が追加された、それほど単純ではないプログラムを作成します。 ChatGPT がプレッシャーの下でどれだけうまく機能するかを見るのが楽しみです。 うまくいけば、あなたもそうです。

マシュー・メイヨー (@mattmayo13) はデータ サイエンティストであり、重要なオンライン データ サイエンスおよび機械学習リソースである KDnuggets の編集長です。 彼の関心は、自然言語処理、アルゴリズムの設計と最適化、教師なし学習、ニューラル ネットワーク、および機械学習への自動化アプローチにあります。 Matthew は、コンピューター サイエンスの修士号とデータ マイニングの卒業証書を取得しています。 彼は kdnuggets の editor1 で連絡できます[dot]コム。

Leave a Comment

Your email address will not be published. Required fields are marked *