データサイエンスのワークフローにChatGPTを統合する:ヒントとベストプラクティス

Integrating ChatGPT into Data Science Workflow Tips and Best Practices.

ChatGPT、その後継の GPT-4、およびそれらのオープンソースの代替品は非常に成功しています。開発者やデータサイエンティストは、より生産的になり、ChatGPT を使用して日常的なタスクを簡素化するようになっています。

ここでは、ChatGPT を使用したデータサイエンスのためのペアプログラミングセッションを通じて、どのように ChatGPT を使用するかを見ていきます。テキスト分類モデルを構築し、データセットを可視化し、モデルの最適なハイパーパラメーターを特定し、さまざまな機械学習アルゴリズムを試し、ChatGPT を使ってこれらすべてを行います。

途中で、プロンプトを構造化して有益な結果を得るための特定のヒントも見ていきます。一緒に進むには、無料の OpenAI アカウントが必要です。GPT-4 ユーザーの場合は、同じプロンプトに従って進むこともできます。

より迅速な動作モデルの構築

scikit-learn の 20 newsgroups データセットを使用して、ChatGPT を使用してニュース分類モデルを構築してみましょう。

使用したプロンプトは以下のとおりです。「sklearn 20 newsgroups データセットを使用して、ニュース分類モデルを構築したいと思います。これについて知っていますか?」

この時点では、私のプロンプトはあまり具体的ではありませんが、目的とデータセットの両方を述べています:

  • 目的:新しい分類モデルの構築
  • 使用するデータセット:scikit-learn の 20 newsgroups データセット

ChatGPT の応答によると、データセットの読み込みから始めるようにとのことです。

# データセットを読み込む
newsgroups_train = fetch_20newsgroups(subset='train', shuffle=True)
newsgroups_test = fetch_20newsgroups(subset='test', shuffle=True)

目的も明示したため(テキスト分類モデルの構築)、ChatGPT はこの方法でこれを行うことができると教えてくれました。

以下の手順が示されていることに気付きます。

  • TfidfVectorizerを使用してテキストの前処理を行い、数値表現を考案する。TF-IDF スコアを使用するこの方法は、CountVectorizerを使用して出現回数をカウントする方法よりも優れています。
  • ナイーブベイズまたはサポートベクターマシン(SVM)分類器を使用して、データセットの数値表現に基づいて分類モデルを作成する。

また、多項式ナイーブベイズ分類器のコードも提供されているため、それを使用して作業モデルを持っているかどうかを確認してみましょう。

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report

# テキストデータを前処理する
vectorizer = TfidfVectorizer(stop_words='english')
X_train = vectorizer.fit_transform(newsgroups_train.data)
X_test = vectorizer.transform(newsgroups_test.data)

# ナイーブベイズ分類器をトレーニングする
clf = MultinomialNB()
clf.fit(X_train, newsgroups_train.target)

# 分類器の性能を評価する
y_pred = clf.predict(X_test)
print(classification_report(newsgroups_test.target, y_pred))

上記のコードを実行しました。予想どおり動作し、エラーなしで、空白の画面から数分でテキスト分類モデルを作成しました。

Output >>
precision    recall  f1-score   support

           0       0.80      0.69      0.74       319
           1       0.78      0.72      0.75       389
           2       0.79      0.72      0.75       394
           3       0.68      0.81      0.74       392
           4       0.86      0.81      0.84       385
           5       0.87      0.78      0.82       395
           6       0.87      0.80      0.83       390
           7       0.88      0.91      0.90       396
           8       0.93      0.96      0.95       398
           9       0.91      0.92      0.92       397
          10       0.88      0.98      0.93       399
          11       0.75      0.96      0.84       396
          12       0.84      0.65      0.74       393
          13       0.92      0.79      0.85       396
          14       0.82      0.94      0.88       394
          15       0.62      0.96      0.76       398
          16       0.66      0.95      0.78       364
          17       0.95      0.94      0.94       376
          18       0.94      0.52      0.67       310
          19       0.95      0.24      0.38       251

    accuracy                           0.82      7532
   macro avg       0.84      0.80      0.80      7532
weighted avg       0.83      0.82      0.81      7532

手元の問題を解決するための動作モデルを得たが、以下は促進する際に役立つヒントです。プロンプトは、次のようにより小さなステップに分割されることができます。

  • scikit-learnの20 newsgroupsデータセットについて詳しく教えてください。
  • このデータセットで実行できる可能性のあるタスクは何ですか? テキスト分類モデルを構築できますか?
  • このアプリケーションに最適な機械学習アルゴリズムは何ですか?

データセットの可視化

はい、テキスト分類モデルをすでに構築しました。しかし、それは本当に速かったので、データセットの単純な可視化を考えてみましょう。

特に、20のニュースカテゴリーにわたるトレーニングサンプルの分布を理解し、クラスの不均衡があるかどうかを特定しようとします。

ここに私が使用したプロンプトがあります。「クラスの分布を理解し、クラスの不均衡を特定するためにデータセットを可視化したいと思います。視覚化を手伝ってもらえますか?」

ChatGPTは、各クラスのサンプル数の棒グラフまたはヒストグラムが良い視覚化であると提案しました。それは合理的です。

ここにmatplotlibで簡単な棒グラフを作成するためにChatGPTが生成したコードがあります:

import matplotlib.pyplot as plt

# Load the dataset
newsgroups_train = fetch_20newsgroups(subset='train', shuffle=True)

# Count the number of samples for each class
class_counts = {}
for label in newsgroups_train.target:
    class_name = newsgroups_train.target_names[label]
    if class_name in class_counts:
        class_counts[class_name] += 1
    else:
        class_counts[class_name] = 1

# Plot the class distribution
plt.bar(class_counts.keys(), class_counts.values())
plt.xticks(rotation=90)
plt.xlabel('Class')
plt.ylabel('Number of Samples')
plt.title('Class Distribution')
plt.show()

ここにプロットがあります。それはきれいで、ラベルが読み取れます。私たちはまた、20のクラスのそれぞれのサンプル数を見ることができます。

20クラスのトレーニングサンプルの分布はほぼ均等であり、クラスの不均衡は見られません。したがって、前のステップで得たモデルは有用です。そして、クラスの不均衡を解決するために新しいサンプリング技術を使用する必要はありません。

ハイパーパラメーターチューニング

次に、モデルのハイパーパラメーターを調整したいと思います。まず、調整できるさまざまなハイパーパラメーターを理解したいと思います。それから、ハイパーパラメーターがあまりにも多くない場合は、簡単なグリッドサーチを行うことができます。

ここにプロンプトがあります。「分類器モデルを改善するために調整できるハイパーパラメーターはありますか?」

私たちが得たコードでは、TfidfVectorizermax_dfもチューニング可能です。TF-IDFスコアは、特定のドキュメントで頻繁に発生する用語に高い重みを割り当て、すべてのドキュメントで頻繁に発生する用語には大幅に低い重みを割り当てることで機能します。 max_dfは、特定の用語を無視するために出現の割合を使用します。

たとえば、max_dfが0.5の場合、すべてのドキュメントで少なくとも50%の頻度で発生する用語は無視されます。必要であれば、これを削除することができます。ただし、私は使用するmax_dfを見るために保持します。

コードは単純なグリッドサーチを使用し、クロスバリデーションスコアに基づいて最適な値を選択します。

from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline

# Define the pipeline with TF-IDF and Multinomial Naive Bayes
pipeline = Pipeline([
    ('tfidf', TfidfVectorizer(stop_words='english')),
    ('clf', MultinomialNB())
])

# Define the hyperparameter grid
param_grid = {
    'tfidf__max_df': [0.5, 0.75, 1.0],
    'clf__alpha': [0.1, 0.5, 1.0],
    'clf__fit_prior': [True, False],
}

# Perform grid search with cross-validation
grid_search = GridSearchCV(pipeline, param_grid, cv=5)
grid_search.fit(newsgroups_train.data, newsgroups_train.target)

# Print the best hyperparameters and cross-validation score
print("Best hyperparameters: ", grid_search.best_params_)
print("Cross-validation score: ", grid_search.best_score_)

Output >>
Best hyperparameters:  {'clf__alpha': 0.1, 'clf__fit_prior': False, 'tfidf__max_df': 0.5}
Cross-validation score:  0.9088736147919108

これらのハイパーパラメータの値を挿入することで、分類精度が約2%向上しました。

ここでは、調整するハイパーパラメータがたくさんあるわけではありませんでした。各ハイパーパラメータが一連の値を取る場合、グリッドサーチを実行するとコストがかかる場合があります。その場合はランダムサーチを実行する方が合理的かもしれません。

異なるモデルでの高速な反復

最初のステップの1つでSVMもこのような分類問題には適していることがわかりました。

今度は、同じデータセット用のサポートベクター分類器を構築したいと思います。

使用したプロンプトは「同じ問題を解決するためにSVMを使用できるか、コードを生成できますか?」でした。

以下のコードを使用します。

from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split

# Load the dataset
newsgroups_train = fetch_20newsgroups(subset='train', shuffle=True)

# Convert the text data to a matrix of TF-IDF features
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(newsgroups_train.data)
y = newsgroups_train.target

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Define the SVM classifier
clf = SVC(kernel='linear')

# Train the SVM classifier
clf.fit(X_train, y_train)

# Predict the class labels for the test set
y_pred = clf.predict(X_test)

# Calculate the accuracy of the SVM classifier
accuracy = accuracy_score(y_test, y_pred)
print('Accuracy:', accuracy)

90%以上の精度スコアがあるため、SVMはこのデータセットに適しているようです。

出力 >> 精度:0.9019001325673884

これにより、同じ問題を解決するために異なるモデルを素早く試すことができることがわかります。

次元削減の探索

動作するモデルを構築した後は、他にも利用可能な手段を調べることができます。ここでは、次元削減を例に挙げます。

この時点で、私は次元削減アルゴリズムを実行する興味はありません。なぜなら、すでに動作するモデルを持っており、特徴空間が非常に高次元ではないからです。したがって、モデル構築の前に次元数を削減する必要はありません。

ただし、この特定のデータセットに対する次元削減のアプローチについて見てみましょう。

使用したプロンプトは「このデータセットに使用できる次元削減技術を教えてください。」でした。

ChatGPTが提案した次のテクニックがあります。

  • 潜在意味解析またはSVD
  • 主成分分析(PCA)
  • 非負値行列因子分解(NMF)

ここで、ChatGPTを使用する際のベストプラクティスを列挙して終了します。

データサイエンスのためにChatGPTを使用するためのベストプラクティス

データサイエンスでChatGPTを使用する際に心に留めておくべきベストプラクティスは次のとおりです。

  • 機密情報やソースコードを入力しないでください:機密情報をChatGPTに入力しないでください。組織のデータチームで作業する場合、顧客データでモデルを構築することがよくありますが、これは機密情報を守る必要があります。同様に、機密のソースコードや開示すべきではない情報を入力しないでください。
  • プロンプトを具体的にしてください:具体的なプロンプトがないと、ChatGPTから有益な回答を得ることはかなり難しいです。したがって、プロンプトを十分に具体的に構造化してください。プロンプトは、少なくとも目的を明確に伝える必要があります。一歩ずつ。
  • 長いプロンプトを小さなプロンプトに分解する:特定のタスクを実行するための思考プロセスがある場合は、より単純なステップに分解して、ChatGPTに各ステップを実行するようにプロンプトを指示してください。
  • ChatGPTを効果的にデバッグする:この例では、すべてのコードがエラーなしで実行されました。しかし、常にそうとは限りません。古い機能、無効なAPIリファレンスなどの理由でエラーが発生する可能性があります。エラーメッセージと関連するトレースバックをプロンプトに入力し、提供される解決策を見て、コードをデバッグしてください。
  • プロンプトを追跡する:日常のデータサイエンスワークフローでChatGPTを頻繁に使用する(または使用する予定がある)場合は、プロンプトを追跡することが役立ちます。これにより、時間の経過とともにプロンプトを洗練し、ChatGPTからより良い結果を得るためのプロンプトエンジニアリング技術を特定できます。

結論

データサイエンスアプリケーションでChatGPTを使用する場合、ビジネス問題を理解することが最初で最も重要なステップです。したがって、ChatGPTは、特定のタスクを単純化および自動化するためのツールであり、開発者の技術的な専門知識の代替品ではありません。

しかし、それでもさまざまなモデルやアルゴリズムを素早く構築してテストするのを助けるという点で、生産性を高めるための貴重なツールです。それでは、ChatGPTを活用してスキルを磨き、より優れた開発者になりましょう!Bala Priya Cは、インド出身の開発者兼技術ライターです。彼女は、数学、プログラミング、データサイエンス、コンテンツ作成の交差点での作業が好きです。彼女の関心と専門分野には、DevOps、データサイエンス、自然言語処理が含まれます。彼女は、読書、執筆、コーディング、そしてコーヒーを楽しんでいます!現在、彼女はチュートリアル、ハウツーガイド、意見記事などの執筆を通じて、開発者コミュニティと彼女の知識を共有することに取り組んでいます。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more