ChatGPT в качестве помощника по программированию и анализу данных на Python.

ChatGPT от OpenAI это… да ладно, вы и сами знаете, что такое ChatGPT. Вы уже достаточно прочитали об этом, и представления больше не нужны. А если вы всё-таки не знаете, что такое ChatGPT, сначала взгляните на эту статью, а затем вернитесь, чтобы продолжить.

О ChatGPT можно разговаривать очень долго, но давайте посмотрим, насколько данная технология может быть полезной на самом деле.

Сейчас вы узнаете, что может сделать ChatGPT, когда дело доходит до написания кода из спецификаций, которые мы предоставляем. Как обычно, начнём по нарастающей – с простого!

Простой скрипт для Data Processing

Я решил, что хорошим вариантом для начала будет какой-нибудь скрипт обработки данных. Поскольку я планирую, чтобы ChatGPT впоследствии написал несколько скриптов машинного обучения, используя различные библиотеки Python, это показалось лучшим вариантом для начала.

Цель

Я хотел предпринять несколько попыток загрузки набора данных; убедиться, что все значения датасета являются числовыми значениями, или преобразовать их в таковые; проверить наличие отсутствующих значений; разделить датасет на обучающий и тестовый наборы.

Подсказка

Напишите скрипт на Python, который выполняет следующее:

  • загружает набор данных из csv на диск в Pandas DataFrame
  • гарантирует, что датасет полностью числовой; преобразует строковые значения в числовые и отслеживает это преобразование в словаре для последующего использования
  • проверяет наличие пропущенных значений в фрейме данных; полностью удаляет запись, имеющую более одного пропущенного значения.
  • разбивает датасет на тестовые и обучающие наборы

Скрипт

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)

Здесь я использовал три функции:

  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 для отсутствующих значений.

Основной скрипт использует эти аргументы в функциях для загрузки, преобразования и очистки набора данных, а затем разбивает его на тестовые и обучающие наборы.

Преобразование нашего кода в потоковое приложение

Цель

Теперь давайте предположим, что мы хотели бы развернуть наше приложение. Давайте заставим ChatGPT обернуть эти функции в Streamlit.

Подсказка

Перепишите вышеупомянутую программу как 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 для создания интерактивного веб-приложения, которая позволяет пользователю вводить путь к файлу, размер процентного соотношения для тестирования / обучения и верхнюю границу для количества пропущенных значений в записи. Затем пользователь может нажать кнопку “Process Data”, чтобы запустить скрипт и предварительно обработать данные. Он использует те же функции, что и предыдущая версия скрипта, для загрузки, преобразования и очистки набора данных, а затем разбивает его на тестовые и обучающие наборы.

Чтобы запустить скрипт, у вас должен быть установлен фреймворк Streamlit, далее вам надо запустить команду pip install streamlite в вашем терминале. После установки запустите скрипт с помощью команды stream lite run script.py .

Анализ

Он сделал то, что должен был сделать. ChatGPT взял наши функции и создал с их помощью простое веб-приложение Streamlight.

ChatGPT в качестве помощника по программированию и анализу данных на Python.
Веб-приложение Streamlit, созданное с помощью скрипта, сгенерированного ChatGPT

Резюме

ChatGPT проделал совершенно компетентную работу по созданию, рефакторингу, расширению и добавлению оболочки вокруг простого скрипта предварительной обработки данных на Python. Именно этого мы и хотели, в начале задуманной работы. Хотя, по большому счету, это была не самая сложная программа, это был шаг в направлении того, чтобы ChatGPT был действительно полезен, выступая в качестве помощника по программированию. Результаты оправдывают наши цели на каждом этапе.

В следующий раз мы создадим менее тривиальную программу с некоторой повышенной сложностью и дополнительными требованиями. Я рад видеть, насколько хорошо ChatGPT работает. Надеюсь, вы тоже.

Машинное обучение

+1
0
+1
8
+1
1
+1
1
+1
0

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *