Что такое прием данных? Как это делается с помощью скриптов python?
Согласно Кембриджскому словарю, данные означают информацию, особенно факты или числа, собранные для изучения и рассмотрения и использования для помощи в принятии решений, или информацию в электронной форме, которая может быть сохранена и использована компьютером.
Проглатывание означает «процесс всасывания питательных веществ или лекарств в организм при их употреблении в пищу или питье».
Следовательно, прием данных означает получение данных из одного или нескольких источников и их обработку в форматах данных, подходящих для рабочей среды. Как правило, это первый этап конвейера данных в проектах машинного обучения, глубокого обучения или анализа данных.
Данные могут присутствовать в наборах данных, размещенных в таких источниках, как Открытые данные Всемирного банка, Репозиторий машинного обучения UCI, Kaggle и т. д.
Процесс приема данных может включать различные этапы в зависимости от доступного источника данных и требований к данным в рабочей среде. Некоторые из них могут включать:
- API-аутентификация
- Загрузка необработанных файлов в формате .zip, .tgz или любом другом формате
- Распаковка необработанных файлов
- Извлечение заголовков и основных данных из разархивированных файлов
- Преобразование данных в нужный формат, например .csv, .tsv и т. д.
- Разделение на наборы данных тестового поезда. Необязательный шаг
Как правило, если объем необработанных данных меньше, то прием данных может выполняться в режиме реального времени. В противном случае, если размер необработанных данных огромен, сначала сохраняются данные из различных источников, а целые данные обрабатываются позже, т. Е. Загрузка данных выполняется пакетно.
Примечание. Хотя на рынке доступно множество инструментов для приема данных, для простоты мы ограничим этот процесс только сценариями Python.
Я расскажу о двух сценариях проекта машинного обучения:
1. Прием данных через Kaggle API
2. Прием данных через URL-адрес репозитория машинного обучения UCI
Прием данных через Kaggle API
Шаг 1. После входа в свою учетную запись Kaggle перейдите на https://www.kaggle.com/‹username›/account и нажмите Создать новый токен API.
Шаг 2: kaggle.json будет загружен. В рабочем каталоге создайте папку с именем .kaggle и вставьте в нее kaggle.json.
Шаг 3: Установите библиотеку Kaggle в рабочий каталог pip install kaggle
Шаг 4: Перейдите к конкретному файлу данных Kaggle, который вы хотите загрузить, скопируйте его URL-адрес и вставьте в код. В моем коде я принял это как kaggle_url=https://www.kaggle.com/datasets/uciml/pima-indians-diabetes-database?select=diabetes.csv
Шаг 5: Получите имя файла и имя набора данных из kaggle_url.
Сначала я разделю kaggle_url, используя regex
split с несколькими разделителями, такими как /, ? или = для получения списка строк.
Чтобы получить имя файла, возьмите последний элемент этого списка. Чтобы получить имя набора данных, присоединитесь к последнему и третьему из последних элементов списка с / между ними
import regex def dataset_and_file_name(kaggle_url:str): kaggle_url = re.split(r'[/?=]', kaggle_url) file=kaggle_url[-1] dataset="/".join(kaggle_url[-4:-2]) return dataset,file
Шаг 6: Напишите функцию для извлечения имени пользователя и ключа kaggle из пути, где хранится kaggle.json
def get_kaggle_username_key(kaggle_json_path:str): with open(kaggle_json_path) as user: user_info=json.load(user) return user_info['username'],user_info['key']
Шаг 7. Аутентифицируйте API Kaggle и загрузите набор данных по указанному пути.
def download_kaggle_dataset(path:str): username,key=get_kaggle_username_key(".kaggle\kaggle.json") os.environ['KAGGLE_USERNAME'] = username os.environ['KAGGLE_KEY'] = key api = KaggleApi() api.authenticate() dataset,file=dataset_and_file_name(kaggle_url) api.dataset_download_file(dataset, file, path) download_kaggle_dataset('data_ingestion/kaggle_artifacts')
Полный код доступен по ссылке на Github. Запуск этого кода создаст файл diabetes.csv в папке kaggle_artificats.
Прием данных через URL-адрес репозитория машинного обучения UCI
Шаг 1: Получение URL-адреса файла
Перейдите по адресу https://archive.ics.uci.edu/ml/machine-learning-databases/spambase. Щелкните правой кнопкой мыши spambase.zip и скопируйте адрес ссылки, вставьте этот URL-адрес в код.
uci_url= “https://archive.ics.uci.edu/ml/machine-learning-databases/spambase/spambase.zip”
Шаг 2: Загрузите необработанный файл
Необработанный файл может быть представлен в формате .zip, .tgz или любом другом формате. Необработанный файл находится в формате .zip для этого конкретного сценария.
Функция request.urlretrieve
в urlib.request
библиотеке используется для загрузки zip-папки. Функция ниже принимает путь (куда будет загружен файл .zip) в качестве аргумента. Сначала он создает каталог пути, если он не существует. Затем создает путь для пути к файлу, присоединяя data.zip
к каталогу пути. Затем он загружает spambase.zip
как data.zip
в пути к файлу. Наконец, он возвращает путь к файлу.
import os import urllib.request as request def download_rawfile(path:str): if not os.path.exists(path): os.makedirs(path) filepath = os.path.join(path,"data.zip").replace("\\","/") request.urlretrieve(uci_url,filepath) return filepath
Шаг 3 Разархивируйте содержимое необработанного файла
zipfile
используется библиотека, и создается простая функция распаковки, которая принимает путь (где присутствует файл .zip) и path_to_unzip (где будут храниться файлы распаковки) в качестве аргумента. Мы вызываем вышеприведенную функцию download_rawfile, чтобы получить путь к файлу, а затем открываем этот файл в режиме чтения и используем extractall для извлечения содержимого файла .zip и сохранения его в path_to_unzip.
from zipfile import ZipFile def unzip_raw(path:str,path_to_unzip:str): filename=download_rawfile(path) with ZipFile(file=filename, mode="r") as zf: zf.extractall(path_to_unzip)
Шаг 4 Получение заголовков
После распаковки нужно быстро просмотреть различные файлы в папке распаковки для поиска необходимых данных. В этом случае основные данные находятся в файле spambase.data
. Этот файл не имеет заголовков. Файл с именем spambase.names
имеет заголовки в строках с 34 по 90. Также отсутствует заголовок целевого столбца.
Итак, мы создадим 2 пользовательские функции. Первая функция принимает path_to_unzip (путь, по которому находится содержимое разархивированного файла) в качестве аргумента и возвращает список путей к файлам, представленных в path_to_unzip.
def list_unzip_files(path_to_unzip:str): file_list=[] for f in os.listdir(path_to_unzip): file_list.append(os.path.join(path_to_unzip,f).replace("\\","/")) return file_list
Вторая функция принимает path_to_header (путь к файлу, содержащему заголовки) в качестве аргумента и возвращает список заголовков.
Эта функция открывает файл в режиме чтения и читает каждую строку, используя функцию readlines()
. Создается список, называемый заголовком. Цикл for используется для перебора строк с 34 по 90 . В каждом цикле он удаляет символ новой строки, разбивает строку с помощью : в качестве разделителя, а затем добавляет первую строку разделенной строки в список заголовков. После этого мы добавляем заголовок целевой переменной («Spam/No_Spam») к списку заголовков и возвращаем список заголовков.
def get_headers(path_to_header:str): file1 = open(path_to_header, 'r') Lines = file1.readlines() header=[] # Strips the newline character and splits with : charater and select the first part for i in range(34,90): header.append(Lines[i].strip().split(':')[0]) header.append("Spam/No_Spam") return header
Шаг 5 Преобразование и сохранение данных в нужный формат
На этом этапе заголовки и основные данные объединяются, преобразуются и сохраняются в желаемом формате (в нашем случае .csv).
Функция принимает filelist (список путей к разархивированным файлам) и path_to_csv (путь, где будет храниться csv). Вызов вышеуказанной функции get_headers с последним элементом списка файлов (который содержит путь к файлу заголовка) выполняется для получения списка заголовков. Фрейм данных Pandas с именем clean_df создается с использованием pd.read_csv()
.
pd.read_csv() принимает первый элемент списка файлов (который содержит путь к файлу основных данных) в качестве пути к файлу и списка заголовков в качестве аргумента имен (аргумент имен pd.read_csv() принимает имена столбцов в качестве списка). Создается путь для csvfile путем присоединения data.csv к path_to_csv. .to_csv используется для сохранения CSV-файла dataframe в csvfilepath. Возвращается путь csvfilepath.
def saving_data(filelist:list,path_to_csv:str): header=get_headers(filelist[-1]) clean_df=pd.read_csv(filelist[0],sep=",",names=header) if not os.path.exists(path_to_csv): os.makedirs(path_to_csv) csvfilepath = os.path.join(path_to_csv,"data.csv").replace("\\","/") clean_df.to_csv(csvfilepath,index=False) return csvfilepath
Шаг 6. Разделите данные на тестовый набор данных Train.
Этот шаг является необязательным и может быть выполнен на более поздних этапах конвейера данных. Набор данных можно разделить на различные библиотеки sklearn.model_selection
, такие как train_test_split
, StratifiedShuffleSplit
и т. д. Но для простоты кода я беру первые 4000 записей в качестве набора данных для обучения и расширяю 601 запись в качестве набора тестовых данных.
Функция принимает csvfilepath (путь, где присутствуют данные .csv) и path_to_train_test (путь директора, где будут храниться поезд и тест) в качестве аргументов. Функция сначала создает clean_dataframe по pd.read_csv()
. Затем создаются train_dataframe и test test_dataframe путем разделения первых 4000 записей как train и оставшихся как test соответственно.
Train_filepath и test_filepath создаются путем присоединения train.csv и test.csv соответственно к path_to_train_test.
Затем train_dataframe и test_dataframe сохраняются в формате .csv по пути train_filepath и test_filepath соответственно с помощью функции .to_csv
панд.
def train_test(csvfilepath:str,path_to_train_test:str): clean_dataframe=pd.read_csv(csvfilepath) if not os.path.exists(path_to_train_test): os.makedirs(path_to_train_test) train_dataframe,test_dataframe=clean_dataframe[:4000],clean_dataframe[4000:] train_filepath=os.path.join(path_to_train_test,"train.csv").replace("\\","/") test_fielpath=os.path.join(path_to_train_test,"test.csv").replace("\\","/") train_dataframe.to_csv(train_filepath,index=False) test_dataframe.to_csv(test_fielpath,index=False)
Полный код доступен по ссылке Github. Запуск этого кода создаст папку uci_artificats, аналогичную приведенной ниже.
└───uci_artifacts ├───clean_data │ │ data.csv │ │ │ └───train_test │ test.csv │ train.csv │ ├───raw_data │ data.zip │ └───unzip_data spambase.data spambase.DOCUMENTATION spambase.names
Спасибо за прочтение.