Press "Enter" to skip to content

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

想要将ChatGPT集成到你的数据科学工作流中吗?以下是一个示例,以及有关如何在数据科学中充分利用ChatGPT的技巧和最佳实践

将ChatGPT整合到数据科学工作流程中:技巧和最佳实践 数据科学 第1张

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

在这里,我们将看到如何通过与ChatGPT的一对编程会话来使用ChatGPT进行数据科学。我们将构建一个文本分类模型,可视化数据集,识别模型的最佳超参数,尝试不同的机器学习算法等,所有这些都是使用ChatGPT完成的。

在此过程中,我们还将查看某些提示以结构化提示,以便获得有用的结果。要跟随本文,您需要拥有免费的OpenAI帐户。如果您是GPT-4用户,您也可以使用相同的提示跟随本文。

更快地构建工作模型

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

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

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

  • 目标:构建新的分类模型
  • 要使用的数据集:scikit-learn中的20个新闻组数据集

ChatGPT的响应告诉我们要从加载数据集开始。 将ChatGPT整合到数据科学工作流程中:技巧和最佳实践 数据科学 第2张

# 加载数据集
newsgroups_train = fetch_20newsgroups(subset='train', shuffle=True)
newsgroups_test = fetch_20newsgroups(subset='test', shuffle=True)

由于我们还声明了目标(构建文本分类模型),ChatGPT告诉我们如何去做。

我们看到它给出了以下步骤:

  • 使用TfidfVectorizer进行文本预处理并得出数值表示。使用TF-IDF分数的方法比使用CountVectorizer计数出现次数的方法更好。
  • 使用朴素贝叶斯或支持向量机(SVM)分类器在数据集的数字表示上创建分类模型。

将ChatGPT整合到数据科学工作流程中:技巧和最佳实践 数据科学 第3张

它还给出了Multinomial Naive Bayes分类器的代码,因此让我们使用它并检查我们是否已经有了一个可行的模型。

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整合到数据科学工作流程中:技巧和最佳实践 数据科学 第4张 ChatGPT建议使用每个类别中样本数量的条形图或直方图作为好的可视化。这听起来很合理。

这是ChatGPT生成的用于在matplotlib中创建简单条形图的代码:

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个类别中的样本数。 将ChatGPT整合到数据科学工作流程中:技巧和最佳实践 数据科学 第5张

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

超参数调整

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

这是我的提示:“有没有可以调整的超参数,可以使分类器模型变得更好?”

将ChatGPT整合到数据科学工作流程中:技巧和最佳实践 数据科学 第6张

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

例如,0.5的max_df表示将忽略在至少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%。

在这里,我们没有很多的超参数需要调整。如果您有许多超参数,每个超参数可以取一组值,运行网格搜索可能会很昂贵。这时,运行随机搜索可能是一个更好的选择。

更快的不同模型迭代

我们在最初的步骤中看到,SVM对于这样的分类问题也可以很好地工作。

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

我使用的提示为:“您能告诉我是否可以使用SVM来解决同样的问题吗?您能生成执行此操作的代码吗?”

将ChatGPT整合到数据科学工作流程中:技巧和最佳实践 数据科学 第7张

代码如下:

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

# 加载数据集
newsgroups_train = fetch_20newsgroups(subset='train', shuffle=True)

# 将文本数据转换为TF-IDF特征矩阵
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(newsgroups_train.data)
y = newsgroups_train.target

# 将数据分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 定义SVM分类器
clf = SVC(kernel='linear')

# 训练SVM分类器
clf.fit(X_train, y_train)

# 预测测试集的分类标签
y_pred = clf.predict(X_test)

# 计算SVM分类器的准确率
accuracy = accuracy_score(y_test, y_pred)
print('Accuracy:', accuracy)

由于我们的准确率超过了90%,因此SVM似乎是解决这个数据集的好选择。

输出 >> 准确率:0.9019001325673884

正如所见,您可以使用ChatGPT快速尝试不同的模型来解决同样的问题。

探索降维

一旦您加倍努力构建一个工作模型,您也可以探索其他可用的方向。让我们以降维为例。

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

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

我使用的提示是:“您能告诉我可以使用哪些降维技术来处理此数据集吗?”

将ChatGPT整合到数据科学工作流程中:技巧和最佳实践 数据科学 第8张

ChatGPT建议使用以下技术:

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

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

使用ChatGPT进行数据科学的最佳实践

以下是在使用ChatGPT进行数据科学时需要记住的一些最佳实践:

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

结论

在使用ChatGPT进行数据科学应用时,理解业务问题是第一步也是最重要的步骤。因此,ChatGPT只是简化和自动化某些任务的工具,而并不是开发人员技术专业知识的替代品。

然而,它仍然是一个非常宝贵的工具,通过帮助快速构建和测试不同的模型和算法,提高生产力。让我们利用ChatGPT磨练我们的技能,成为更好的开发人员!Bala Priya C来自印度,是一名开发人员和技术作家。她喜欢在数学、编程、数据科学和内容创作的交叉口工作。她感兴趣和专业的领域包括DevOps、数据科学和自然语言处理。她喜欢阅读、写作、编码和咖啡!目前,她正在通过撰写教程、指南、观点文章等来学习和与开发者社区分享她的知识。

Leave a Reply

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