分享

将 ChatGPT 集成到数据科学工作流程中:技巧和最佳实践



1.jpg

ChatGPT、其继任者 GPT-4 及其开源替代方案都非常成功。开发人员和数据科学家都希望提高工作效率并使用 ChatGPT 来简化他们的日常任务。

在这里,我们将通过与 ChatGPT 的结对编程会话了解如何将 ChatGPT 用于数据科学。我们将构建文本分类模型、可视化数据集、确定模型的最佳超参数、尝试不同的机器学习算法等等——所有这些都使用 ChatGPT。

在此过程中,我们还将查看某些构建提示的技巧,以获得有用的结果。要继续学习,您需要有一个免费的 OpenAI 帐户。如果您是 GPT-4 用户,也可以按照相同的提示进行操作。


更快地构建工作模型

让我们尝试使用 ChatGPT 为scikit-learn 中的 20 个新闻组数据集构建一个新闻分类模型。

这是我使用的提示:“我想使用 sklearn 20 新闻组数据集构建新闻分类模型。你知道这件事吗?

虽然此时我的提示不是很具体,但我已经说明了目标和数据集:

  • 目的:建立一个新的分类模型
  • 使用的数据集:来自 scikit-learn 的 20 个新闻组数据集

ChatGPT 的响应告诉我们从加载数据集开始。


1.jpg

  1. # Load the dataset
  2. newsgroups_train = fetch_20newsgroups(subset='train', shuffle=True)
  3. newsgroups_test = fetch_20newsgroups(subset='test', shuffle=True)
复制代码
正如我们还陈述了目标(构建文本分类模型)一样,ChatGPT 告诉我们如何才能做到这一点。

我们看到它为我们提供了以下步骤:

  • 用于TfidfVectorizer文本预处理并提出数字表示。这种使用 TF-IDF 分数的方法优于使用CountVectorizer.
  • 使用朴素贝叶斯或支持向量机 (SVM) 分类器在数据集的数字表示上创建分类模型。



1.jpg

它还提供了多项式朴素贝叶斯分类器的代码,所以让我们使用它并检查我们是否已经有了一个工作模型。
  1. from sklearn.feature_extraction.text import TfidfVectorizer
  2. from sklearn.naive_bayes import MultinomialNB
  3. from sklearn.metrics import classification_report
  4. # Preprocess the text data
  5. vectorizer = TfidfVectorizer(stop_words='english')
  6. X_train = vectorizer.fit_transform(newsgroups_train.data)
  7. X_test = vectorizer.transform(newsgroups_test.data)
  8. # Train a Naive Bayes classifier
  9. clf = MultinomialNB()
  10. clf.fit(X_train, newsgroups_train.target)
  11. # Evaluate the performance of the classifier
  12. y_pred = clf.predict(X_test)
  13. print(classification_report(newsgroups_test.target, y_pred))
复制代码
我继续运行上面的代码。它按预期工作——没有错误。我们在几分钟内从一个空白屏幕变成了一个文本分类模型,只需要一个提示。
  1. Output >>
  2. precision    recall  f1-score   support
  3.            0       0.80      0.69      0.74       319
  4.            1       0.78      0.72      0.75       389
  5.            2       0.79      0.72      0.75       394
  6.            3       0.68      0.81      0.74       392
  7.            4       0.86      0.81      0.84       385
  8.            5       0.87      0.78      0.82       395
  9.            6       0.87      0.80      0.83       390
  10.            7       0.88      0.91      0.90       396
  11.            8       0.93      0.96      0.95       398
  12.            9       0.91      0.92      0.92       397
  13.           10       0.88      0.98      0.93       399
  14.           11       0.75      0.96      0.84       396
  15.           12       0.84      0.65      0.74       393
  16.           13       0.92      0.79      0.85       396
  17.           14       0.82      0.94      0.88       394
  18.           15       0.62      0.96      0.76       398
  19.           16       0.66      0.95      0.78       364
  20.           17       0.95      0.94      0.94       376
  21.           18       0.94      0.52      0.67       310
  22.           19       0.95      0.24      0.38       251
  23.     accuracy                           0.82      7532
  24.    macro avg       0.84      0.80      0.80      7532
  25. weighted avg       0.83      0.82      0.81      7532
复制代码
虽然我们有一个工作模型来解决手头的问题,但这里有一些提示可以在提示时为您提供帮助。提示可能会更好并分解成更小的步骤,如下所示:

  • 请告诉我更多关于 scikit-learn 20 新闻组数据集的信息。
  • 我可以使用此数据集执行哪些可能的任务?我可以构建文本分类模型吗?
  • 你能告诉我哪种机器学习算法最适合这个应用程序吗?





可视化数据集

好的,我们已经建立了一个文本分类模型。但它发生得非常快,所以让我们放慢速度,尝试想出数据集的简单可视化。

特别是,让我们尝试了解训练样本在 20 个新闻类别中的分布,并确定是否存在任何类别不平衡。

这是我使用的提示:“我想可视化数据集以了解类别分布并识别类别不平衡。你能帮我想象一下吗?”


1.jpg

ChatGPT 建议每个类别中的样本数量的条形图或直方图将是一个很好的可视化。这听起来很合理。
以下是 ChatGPT 生成的用于在 matplotlib 中创建简单条形图的代码:

  1. import matplotlib.pyplot as plt
  2. # Load the dataset
  3. newsgroups_train = fetch_20newsgroups(subset='train', shuffle=True)
  4. # Count the number of samples for each class
  5. class_counts = {}
  6. for label in newsgroups_train.target:
  7.     class_name = newsgroups_train.target_names[label]
  8.     if class_name in class_counts:
  9.         class_counts[class_name] += 1
  10.     else:
  11.         class_counts[class_name] = 1
  12. # Plot the class distribution
  13. plt.bar(class_counts.keys(), class_counts.values())
  14. plt.xticks(rotation=90)
  15. plt.xlabel('Class')
  16. plt.ylabel('Number of Samples')
  17. plt.title('Class Distribution')
  18. plt.show()
复制代码
这是情节。它很整洁,标签可读。我们还可以看到 20 个类别中每个类别的样本数量。


1.png

训练样本在 20 个类中的分布大致均匀,没有明显的类不平衡。因此,我们在上一步中获得的模型是有用的。而且我们不需要使用任何新颖的重采样技术来解决类不平衡问题。


超参数调整

接下来,我想调整模型的超参数。首先,我想了解可以调整的不同超参数。然后,如果没有太多超参数,我们可以做一个简单的网格搜索。

这是提示:“是否有任何我可以调整的超参数来使分类器模型更好?”


1.jpg

在我们得到的代码中,max_df因为TfidfVectorizer也是可调的。我们知道 TF-IDF 分数的工作原理是为特定文档中频繁出现的术语分配更高的权重,同时为所有文档中频繁出现的术语分配低得多的权重。使用max_df出现百分比来忽略特定术语。

例如,max_df0.5 表示将忽略出现在至少 50% 的文档中的所有术语。如果你愿意,你可以删除它。但我将保留它只是为了看看  max_df我能用到什么。

该代码使用简单的网
  1. 格搜索并根据交叉验证
复制代码

分数选择最佳值。

  1. from sklearn.model_selection import GridSearchCV
  2. from sklearn.pipeline import Pipeline
  3. # Define the pipeline with TF-IDF and Multinomial Naive Bayes
  4. pipeline = Pipeline([
  5.     ('tfidf', TfidfVectorizer(stop_words='english')),
  6.     ('clf', MultinomialNB())
  7. ])
  8. # Define the hyperparameter grid
  9. param_grid = {
  10.     'tfidf__max_df': [0.5, 0.75, 1.0],
  11.     'clf__alpha': [0.1, 0.5, 1.0],
  12.     'clf__fit_prior': [True, False],
  13. }
  14. # Perform grid search with cross-validation
  15. grid_search = GridSearchCV(pipeline, param_grid, cv=5)
  16. grid_search.fit(newsgroups_train.data, newsgroups_train.target)
  17. # Print the best hyperparameters and cross-validation score
  18. print("Best hyperparameters: ", grid_search.best_params_)
  19. print("Cross-validation score: ", grid_search.best_score_)
复制代码

  1. Output >>
  2. Best hyperparameters:  {'clf__alpha': 0.1, 'clf__fit_prior': False, 'tfidf__max_df': 0.5}
  3. Cross-validation score:  0.9088736147919108
复制代码
代入这些超参数的值,我的分类准确率提高了大约 2%。

在这里,我们没有太多要调整的超参数。如果您有很多超参数,其中每个超参数都可以采用一组值,那么运行网格搜索可能会很昂贵。运行随机搜索可能更有意义。


不同模型的更快迭代

我们在第一步中看到 SVM 也可以很好地解决此类分类问题。

我现在想为同一个数据集构建一个支持向量分类器。

我使用的提示:“你能告诉我是否可以使用 SVM 来解决同样的问题吗?你能生成代码来做到这一点吗?”


1.jpg

现在我们开始:
  1. from sklearn.datasets import fetch_20newsgroups
  2. from sklearn.feature_extraction.text import TfidfVectorizer
  3. from sklearn.svm import SVC
  4. from sklearn.metrics import accuracy_score
  5. from sklearn.model_selection import train_test_split
  6. # Load the dataset
  7. newsgroups_train = fetch_20newsgroups(subset='train', shuffle=True)
  8. # Convert the text data to a matrix of TF-IDF features
  9. vectorizer = TfidfVectorizer()
  10. X = vectorizer.fit_transform(newsgroups_train.data)
  11. y = newsgroups_train.target
  12. # Split the data into training and testing sets
  13. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
  14. # Define the SVM classifier
  15. clf = SVC(kernel='linear')
  16. # Train the SVM classifier
  17. clf.fit(X_train, y_train)
  18. # Predict the class labels for the test set
  19. y_pred = clf.predict(X_test)
  20. # Calculate the accuracy of the SVM classifier
  21. accuracy = accuracy_score(y_test, y_pred)
  22. print('Accuracy:', accuracy)
复制代码
鉴于我们的准确率超过 90%,SVM 似乎是该数据集的不错选择。
  1. Output >> Accuracy: 0.9019001325673884
复制代码
如图所示,您可以使用 ChatGPT 快速尝试不同的模型来解决相同的问题。




探索降维

在加倍努力构建工作模型后,您还可以探索其他可用方向。让我们以降维为例。

此时,我对运行降维算法不感兴趣,因为我已经有了一个工作模型。而且特征空间的维度不是很高。所以我们不需要在模型构建之前减少维度的数量。

但是,让我们看看这个特定数据集的降维方法。

我使用的提示:“你能告诉我可以用于这个数据集的降维技术吗?”


1.jpg

ChatGPT 建议使用以下技术:

  • 潜在语义分析或 SVD
  • 主成分分析 (PCA)
  • 非负矩阵分解 (NMF)

让我们通过列举使用 ChatGPT 的最佳实践来结束我们的讨论。


将 ChatGPT 用于数据科学的最佳实践

以下是将 ChatGPT 用于数据科学时要牢记的一些最佳实践:

  • 不要输入敏感数据和源代码:不要将任何敏感数据输入 ChatGPT。当您在组织中的数据团队工作时,您通常会在客户数据上构建模型——这些数据应该保密。您可以改为尝试为类似的公开可用数据集构建原型,并尝试将其转置到您的数据集或问题中。同样,不要输入敏感的源代码或任何不应公开的信息。
  • 具体提示:如果没有具体提示,很难从 ChatGPT 获得有用的答案。因此,构建您的提示,使其足够具体。提示至少应该清楚地传达目标。一步一步来。
  • 将较长的提示分解为较小的提示:如果您对完成特定任务有一系列想法,请尝试将其分解为更简单的步骤,并提示 ChatGPT 执行每个步骤。
  • 使用 ChatGPT 进行有效调试:在这个例子中,我们得到的所有代码都没有错误地运行;但情况可能并非总是如此。由于不推荐使用的功能、无效的 API 引用等,您可能会遇到错误。当您遇到错误时,您可以在提示中输入错误消息和相关回溯。并查看提供的解决方案,然后继续调试您的代码。
  • 跟踪提示:如果您在日常数据科学工作流程中经常使用(或计划使用)ChatGPT,那么跟踪提示可能是个好主意。这有助于随着时间的推移改进提示,并确定提示工程技术,以便从 ChatGPT 获得更好的结果。



结论

在将 ChatGPT 用于数据科学应用程序时,了解业务问题是第一步,也是最重要的一步。因此,ChatGPT 只是一种简化和自动化某些任务的工具,并不能替代开发人员的技术专长。

但是,它仍然是通过帮助快速构建和测试不同模型和算法来提高生产力的宝贵工具。因此,让我们利用 ChatGPT 来磨练我们的技能并成为更好的开发人员!

Bala Priya C是来自印度的开发人员和技术作家。她喜欢在数学、编程、数据科学和内容创作的交叉领域工作。她的兴趣和专长领域包括 DevOps、数据科学和自然语言处理。她喜欢阅读、写作、编码和咖啡!目前,她致力于通过编写教程、操作指南、评论文章等方式学习并与开发人员社区分享她的知识。



---------我的底线-----------

中文版ChatGPT
https://chat.aboutyun.com/

加微信赠送Chat GPT教程:



获取更多资源:
领取100本书+1T资源
http://www.aboutyun.com/forum.php?mod=viewthread&tid=26480

大数据5个项目视频
http://www.aboutyun.com/forum.php?mod=viewthread&tid=25235

名企资源、名企面试题、最新BAT面试题、专题面试题等资源汇总
https://www.aboutyun.com/forum.php?mod=viewthread&tid=27732


加微信w3aboutyun,可拉入技术爱好者群

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条