Вводное руководство по машинному обучению с использованием Python
Привет! Если вам интересно, что, черт возьми, такое Машинное обучение (ML), как Анализ данных связан с ML и почему мы слышим о Python каждый раз, когда вы сталкивались с ML / Data Analysis? не беспокойтесь больше, вы собираетесь найти ответы сейчас.
После прочтения этой статьи вы получите некоторое базовое представление о том, что такое машинное обучение, почему Python так популярен для выполнения анализа данных для моделей машинного обучения, и вы сможете с уверенностью присоединиться к беседе о машинном обучении на своем рабочем месте. Эта статья может стать вашим первым шагом на пути к изучению этих технологий. Так что не будем больше откладывать и сразу переходить к темам.
Что такое машинное обучение?
Машинное обучение - это подмножество искусственного интеллекта (ИИ), при котором вы обучаете модель думать и работать как человек, извлекая закономерности из предоставленных данных. Если в программу ML загружается 99 строк данных, ваш алгоритм сможет предсказать сотую строку без явного программирования человеком. Машинное обучение в целом подразделяется на три метода: Обучение с учителем, Обучение без учителя и Обучение с подкреплением. В этой статье мы будем работать над вариантом использования контролируемого обучения, где вы можете узнать о нем больше. На medium.com есть много замечательных статей, в которых рассказывается о машинном обучении, но я нашел статью, в которой изложен полный обзор машинного обучения в простой терминологии, которая может быть полезна для вас, чтобы лучше понять машинное обучение.
Что такое анализ данных?
С точки зрения непрофессионала, анализ данных - это не что иное, как понимание ваших данных. До эпохи Интернета данные были очень ограничены, поскольку источники были минимальными. Но теперь почти все является источником данных от смартфона в вашей руке до вашей истории поиска. Итак, теперь у нас есть не только миллионы данных, но и их разновидности, такие как структурированные, неструктурированные и частично структурированные данные. Давайте рассмотрим пример простого листа Excel со 100 столбцами и более 50 тыс. Записей в качестве источника данных. Чтобы получить полезный вывод из данных, вам нужно сначала начать их понимать. Итак, вы можете выполнить следующие шаги для анализа данных.
- Определите назначение столбцов в Excel по их названиям.
- Определите столбцы, которые вам полезны.
- Избавьтесь от ненужных столбцов данных.
- Удалите повторяющиеся или нулевые значения из интересующих вас столбцов.
- Преобразуйте любые специальные или нежелательные символы в числовые или значимые данные.
Вот и все! Вы выполнили основные шаги по очистке и анализу источника данных. Конечно, когда вы работаете в организации, данные не будут простой таблицей Excel. Данные могут быть в любом формате и любом типе: это может быть файл CSV, файлы дампа журнала, файлы транзакций, базы данных и т. Д. Анализировать их только человеческими усилиями будет сложной и утомительной задачей. Итак, мы пользуемся помощью различных доступных языков программирования, таких как Python, R, Java, SQL, Scala и т. Д., А также многих инструментов, таких как IBM SPSS, Power BI, Matlab. Теперь это подводит нас к следующей теме статьи, почему мы используем Python для анализа данных и почему это лучший язык для изучения данными специалистами или энтузиастами.
Почему Python так популярен для машинного обучения?
К вашему удивлению, Python существует с 90-х годов. Но в наши дни он стал популярным благодаря своему сообществу открытого исходного кода. Python имеет больше преимуществ перед многими языками программирования, такими как:
- Написание кода на Python просто, поскольку позволяет избежать написания большого количества шаблонного кода.
- Python делает упор в основном на его четкую читаемость и синтаксис естественного языка.
- Этому также можно легко научиться благодаря Интернету с множеством руководств.
- Главное преимущество Python - это его потрясающие библиотеки.
Библиотеки - это не что иное, как набор функций или методов, которые вы можете использовать в своем коде для выполнения определенных действий, просто импортируя и вызывая их, когда это необходимо, вместо того, чтобы писать все с нуля. Python имеет мощные библиотеки для машинного обучения, такие как Pandas, NumPy, SciPy, Seaborn, Matplotlib, Scrapy, Scikit-learn, Tensorflow, PyTorch, Plotly и т. Д.
Теперь пусть вас не смущают и не ошеломляют все эти библиотеки и их названия. В идеале вы не будете использовать их все для анализа данных и создания моделей машинного обучения. Но для специалиста по данным желательно иметь хорошие знания о некоторых из них, что значительно облегчает его работу. Вы получите лучшее понимание этих библиотек, когда будете использовать их для конкретного случая использования, поэтому достаточно поговорить о библиотеках. Давайте приступим к некоторым действиям, попробовав решить сценарий использования, используя методы анализа данных с помощью Python и построив модель прогнозирующего машинного обучения.
Сценарий использования:
Как я упоминал ранее, в Интернете доступно множество ресурсов для изучения машинного обучения, анализа данных и Python. Используя некоторые из этих ресурсов, мы рассмотрим набор данных о зарплате взрослых, доступный в репозитории машинного обучения UCI или Kaggle.
Я включил свою работу над этим набором данных в свой блокнот Kaggle, который можно найти здесь. В этой записной книжке есть соответствующие комментарии к каждой строке кода для лучшего понимания, а также я бы использовал фрагменты кода из записной книжки, чтобы подробнее рассказать в этой статье.
Описание проблемы:
Вам предоставлен набор данных Excel, состоящий из 15 столбцов и 48842 строк. Наша задача - проанализировать набор данных и спрогнозировать, превысит ли доход взрослого 50 тысяч в год или нет, путем разработки модели машинного обучения с учителем.
Хорошо, давайте начнем с импорта некоторых необходимых библиотек / модулей. Как я упоминал ранее в этой статье, библиотеки - это не что иное, как тонны уже написанных строк кода, все, что вам нужно сделать, - это использовать их при необходимости. Комментарии по каждому импорту объяснят цель.
# Import libraries import numpy as np # linear algebra import pandas as pd # data processing, # Libraries for data visualization import matplotlib.pyplot as pplt import seaborn as sns from pandas.plotting import scatter_matrix # Import scikit_learn module for the algorithm/model: Linear Regression from sklearn.linear_model import LogisticRegression # Import scikit_learn module to split the dataset into train.test sub-datasets from sklearn.model_selection import train_test_split # Import scikit_learn module for k-fold cross validation from sklearn.model_selection import KFold from sklearn.model_selection import cross_val_score # import the metrics class from sklearn import metrics # import stats for accuracy import statsmodels.api as sm
Следующим шагом является загрузка набора данных.
#load the dataset provided salary_dataset = pd.read_csv('../input/adult-incomedataset/adult.csv')
Теперь, если вы внимательно проследите за этой строкой кода выше, возможно, вас заинтриговали. Эта одна строка кода многое объясняет о простом синтаксисе естественного языка Python. Поскольку мы хотим прочитать / загрузить CSV, мы просто используем функцию read_csv (), предоставляемую библиотекой Pandas, которую мы уже импортировали и присвоили ей псевдоним pd. Итак, теперь все, что нам нужно сделать, это вызвать соответствующую функцию из библиотеки, то есть pd.read_csv (). Это показывает нам, насколько мощны библиотеки Python, которые могут загружать файл CSV в одну строку.
Анализируя данные:
Приступим к анализу предоставленного Excel. Нам нужно знать количество столбцов, строк, нулевых объектов и т. Д. Итак, давайте откроем лист Excel и начнем подсчет столбцов, получим количество строк, пройдемся по каждой строке, чтобы найти в ней какие-либо специальные символы или нулевые значения, узнайте тип данных каждого предоставленного столбца. Звучит утомительно и громоздко, правда? не волнуйтесь, Python и его библиотеки готовы помочь, давайте узнаем, как это сделать.
# salary dataset info to find columns and count of the data salary_dataset.info()
посмотрите, насколько это просто, снова просто строка кода, в которой мы вызываем соответствующую функцию .info (), предоставленную pandas. Мы получаем всю необходимую нам информацию, такую как тип данных, количество нулевых значений, количество строк и т. Д.
мы видим, что в некоторых именах столбцов есть специальные символы. Было бы лучше, если бы мы удалили их, поскольку они могут вызвать проблемы при анализе данных. Мы можем легко сделать это, используя функцию Pandas .rename (), как показано ниже.
#replacing some special character columns names with proper names df.rename(columns={'capital-gain': 'capital gain', 'capital-loss': 'capital loss', 'native-country': 'country','hours-per-week': 'hours per week','marital-status': 'marital'}, inplace=True) df.columns
Взглянув на предоставленные данные, мы видим, что в них есть некоторые специальные символы, такие как ‘?’. Итак, давайте посмотрим, сколько специальных символов присутствует в данных.
Очистка данных:
#Finding the special characters in the data frame df.isin(['?']).sum(axis=0)
Использование специальных символов в данных не рекомендуется, поскольку это может привести к неправильному анализу данных и моделям прогнозирования. Итак, нам нужно от них избавиться. Для этого мы можем использовать библиотеки, как показано ниже.
# code will replace the special character to nan and then drop the columns df['country'] = df['country'].replace('?',np.nan) df['workclass'] = df['workclass'].replace('?',np.nan) df['occupation'] = df['occupation'].replace('?',np.nan) #dropping the NaN rows now df.dropna(how='any',inplace=True)
Сначала замените все '?' на NaN (NaN используется в качестве заполнителя для отсутствующих данных в пандах), для этого используйте строку Python replace () function с NumPy (ранее импортированным как np) nan.
Во-вторых, используйте функцию .dropna (), чтобы удалить строки с пропущенными значениями. dropna () может отбрасывать столбцы или строки, по умолчанию он удаляет строки, если ключевое слово оси не упоминается. how = ’any’ удалит строки, если в них отсутствуют отсутствующие значения. Вы можете узнать больше о dropna () по этой ссылке w3resource.
Функциональная инженерия:
Модель машинного обучения требует входных данных в числовых обозначениях, чтобы извлекать из нее закономерности и делать прогнозы. Но не все данные, представленные в нашем исходном наборе данных, являются числовыми. Некоторые из предоставленных данных являются категориальными данными, такими как рабочий класс, образование, семейное положение, род занятий, родство и т. Д., Нам необходимо преобразовать их в числовые обозначения.
Здесь данные - это не что иное, как функция, которую наша модель использует в качестве входных данных. Итак, мы выполняем проектирование функций для наших данных, чтобы создать значимые числовые данные из исходного набора данных.
У нас есть 15 функций (столбцов), наша конечная цель - спрогнозировать функцию дохода, которая делает доход нашей зависимой переменной. Если какая-либо из оставшихся 14 функций влияет на целевую функцию, эти функции называются независимыми переменными.
Чтобы сохранить краткость статьи и избежать нерелевантных данных для нашей модели, мы будем избегать менее уникальных или шумных особенностей наших входных данных. Это помогает нам уточнить наши функции для определения независимых переменных. Но это может не относиться ко всем наборам данных, это зависит от того, с какими данными вы имеете дело и насколько важна функция.
#running a loop of value_counts of each column to find out unique values. for c in df.columns: print ("---- %s ---" % c) print (df[c].value_counts())
Здесь мы запустили цикл for для всех столбцов, используя функцию Pandas .value_counts (), которая возвращает нам количество уникальных значений. Мы видим, что некоторые из предоставленных данных уникальны, например, атрибут «рабочий класс», который имеет только 7 различных значений, а некоторые столбцы имеют множество различных значений, например атрибут fnlgwt, который имеет около 2000+ значений.
Итак, давайте отбросим атрибуты с зашумленными данными.
#dropping based on uniquness of data from the dataset df.drop(['educational-num','age', 'hours per week', 'fnlwgt', 'capital gain','capital loss', 'country'], axis=1, inplace=True)
Функция Pandas .drop () используется для удаления указанных столбцов или строк. axis = 1 означает, что мы собираемся удалить сам столбец, inplace = True означает, что мы заменяем исходный фрейм данных, то есть df, очищенным набором данных после удаления столбцы.
Теперь у нас осталось 8 функций, которые являются категориальными данными. Как мы обсуждали ранее, нам необходимо преобразовать эти данные в числовые обозначения, понятные нашей модели машинного обучения. Есть много разных способов достижения такого преобразования данных, которые подробно описаны здесь. Простой и базовый способ замены категориальных данных числовыми, то есть с помощью функции Pandas .map ().
Начнем с нашего целевого атрибута - столбца дохода. Мы видим, что в столбце дохода есть два уникальных значения: ‘‹ = 50K ’ и ‘ ›50K’. Мы можем легко сопоставить эти строковые символы с числовыми данными с помощью функции .map (), как показано ниже.
#mapping the data into numerical data using map function df['income'] = df['income'].map({'<=50K': 0, '>50K': 1}).astype(int)
мы видим, что теперь у нашего атрибута дохода есть числовые данные. Функция Pandas .map () заменила каждое '‹= 50K' на значение 0 и '› 50K' на 1, а .astype (int) означает, что заменяемое значение должно иметь тип int.
Используя функцию карты, мы можем преобразовать все другие категориальные данные в наборе данных в числовые данные.
#gender df['gender'] = df['gender'].map({'Male': 0, 'Female': 1}).astype(int) #race df['race'] = df['race'].map({'Black': 0, 'Asian-Pac-Islander': 1, 'Other': 2, 'White': 3, 'Amer-Indian-Eskimo': 4}).astype(int) #marital df['marital'] = df['marital'].map({'Married-spouse-absent': 0, 'Widowed': 1, 'Married-civ-spouse': 2, 'Separated': 3, 'Divorced': 4,'Never-married': 5, 'Married-AF-spouse': 6}).astype(int) #workclass df['workclass'] = df['workclass'].map({'Self-emp-inc': 0, 'State-gov': 1,'Federal-gov': 2, 'Without-pay': 3, 'Local-gov': 4,'Private': 5, 'Self-emp-not-inc': 6}).astype(int) #education df['education'] = df['education'].map({'Some-college': 0, 'Preschool': 1, '5th-6th': 2, 'HS-grad': 3, 'Masters': 4, '12th': 5, '7th-8th': 6, 'Prof-school': 7,'1st-4th': 8, 'Assoc-acdm': 9, 'Doctorate': 10, '11th': 11,'Bachelors': 12, '10th': 13,'Assoc-voc': 14,'9th': 15}).astype(int) #occupation df['occupation'] = df['occupation'].map({ 'Farming-fishing': 1, 'Tech-support': 2, 'Adm-clerical': 3, 'Handlers-cleaners': 4, 'Prof-specialty': 5,'Machine-op-inspct': 6, 'Exec-managerial': 7,'Priv-house-serv': 8,'Craft-repair': 9,'Sales': 10, 'Transport-moving': 11, 'Armed-Forces': 12, 'Other-service': 13,'Protective- serv':14}).astype(int) #relationship df['relationship'] = df['relationship'].map({'Not-in-family': 0, 'Wife': 1, 'Other-relative': 2, 'Unmarried': 3,'Husband': 4,'Own-child': 5}).astype(int)
Окончательный числовой вывод нашего набора данных будет:
Итак, мы, наконец, подошли к нашему набору данных всех числовых обозначений. которые теперь можно использовать в любом алгоритме прогнозного моделирования машинного обучения. Прежде чем мы попытаемся это сделать, мы должны визуализировать данные и искать любые корреляции, которые мы можем установить между переменными нашего набора данных.
Визуализация данных:
Здесь мы попытаемся выяснить связь между каждым столбцом окончательного набора числовых данных и целевым доходом от атрибута. Этого можно достичь, создав столбчатую диаграмму между доходом и каждым из других столбцов.
#plotting a bar graph for Education against Income to see the co-relation between these columns df.groupby('education').income.mean().plot(kind='bar')
Мы строим гистограмму, используя функцию панд .plot (), чтобы визуализировать взаимосвязь между атрибутами образования и дохода. Мы достигаем этого, группируя значения образования с помощью функции pandas .groupby () по отношению к среднему значению атрибута дохода с помощью .mean (). Таким же образом мы можем построить гистограммы для всех других независимых атрибутов в зависимости от дохода, как показано ниже.
С помощью этих визуализаций мы можем вывести некоторые корреляции между нашими независимыми атрибутами и зависимыми атрибутами:
- Взрослые с образованием в профшколе (7) и докторантуре (10) будут иметь более высокий доход, и вполне вероятно, что их доход превышает 50 тысяч.
- Наши данные показывают, что люди с профессией Prof-speciality (5) и Exec-manager (7) будут иметь больше шансов получить доход более 50K.
- Гистограмма по полу дает нам полезное представление о данных о том, что мужчины (0) с большей вероятностью имеют более высокий доход.
- Диаграмма отношений показывает нам, что жена (1) и муж (4) имеют более высокий доход. Супружеская пара, скорее всего, заработает ›50K.
- Согласно данным, у азиатского жителя Pac-острова (1) или белого (3) больше шансов заработать более 50K.
- Группы рабочего класса с самообслуживанием (0), федеральным правительством (2) имеют более высокий шанс заработать более 50 тысяч.
Мы видим, что все наши числовые атрибуты имеют некоторое влияние на целевой переменный доход. Итак, мы должны создать модель машинного обучения, введя в нее все наши числовые данные.
Выбор модели:
На выбор доступно около 60+ алгоритмов прогнозного моделирования. Мы должны хорошо понимать наши данные и желаемое решение, которое мы ищем, чтобы сузить выбор модели. Здесь наша цель - предсказать доход, который может быть либо 0, либо 1 (менее 50 000 или более 50 000), и мы хотим определить связь между нашим результатом (доходом) и остающимися независимыми характеристиками (образование, класс работы, пол и т. Д.) ). Этот сценарий является классическим примером классификации (определите, составляет ли доход
Для обучения нашей модели нам предоставлено 48K строк помеченного набора данных, помеченных столбцом вывода «доход». Когда набор данных помечен и функция вывода известна, мы выбираем метод машинного обучения контролируемого обучения. Итак, наш вариант использования - это контролируемое обучение плюс классификация. Основываясь на этих критериях, мы можем сузить наш выбор моделей до нескольких:
- Логистическая регрессия
- KNN или k-ближайшие соседи
- Машины опорных векторов
- Наивный байесовский классификатор
- Древо решений
- Случайный Форрест
Логистическая регрессия:
Логистическая регрессия - один из самых простых и наиболее часто используемых алгоритмов контролируемого машинного обучения для категориальной классификации. Основные фундаментальные концепции логистической регрессии легко понять и могут использоваться в качестве базового алгоритма для любой задачи двоичной (0 или 1) классификации. Для этого варианта использования мы собираемся выбрать логистическую регрессию в качестве нашей модели классификации, поскольку это будет хорошим началом для любого новичка, который может начать с простого, но популярного алгоритма.
Логистическая регрессия - это модель статистического прогнозирования, которая может прогнозировать либо «Да» (1), либо «Нет» (0). Он основан на функции Logit или Sigmoid, которая находится в диапазоне от 0 до 1. Теперь не пугайтесь, услышав математическую функцию. Позвольте мне объяснить вам это простым языком.
Если мы заметим здесь, сигмовидная функция представляет собой S-образную кривую, которая простирается между значениями 0 и 1, которая строится на основе выходных данных функции, когда в нее подается набор данных. Мы можем видеть, что уравнение сигмовидной функции - это 1, деленная на 1, плюс е, возведенное в -z, где e - математическая константа, называемая числом Эйлера.
Таким образом, выход уравнения должен быть чем-то между 0 и 1. Если значение z переходит в значение положительной бесконечности, прогнозируемое значение будет равно 1, или если оно переходит в отрицательную бесконечность, оно становится равным 0. Если вы загрузите сигмовидную функцию с помощью Имея числовые данные, мы получим значение, которое либо меньше 0,5, то есть классифицируется как 0, либо больше 0,5, которое классифицируется как 1.
Хорошо! это вся математика, лежащая в основе логистической регрессии, вам действительно нужно изучить и понять ее, поскольку библиотека Python scikit решит все эти математические задачи за вас с помощью одного вызова функции. Но для хорошего специалиста по анализу данных знание математики просто необходимо.
Теперь давайте посмотрим, как мы можем использовать библиотеки Python Scikit для решения нашей проблемы классификации.
Отличительные особенности:
#Transform the data set into a data frame #X axis = We concatenate the Relationship, Education,Race,Occupation columns concate using np.c_ provided by the numpy library df_x = pd.DataFrame(np.c_[df['relationship'], df['education'], df['race'],df['occupation'],df['gender'],df['marital'],df['workclass']], columns = ['relationship','education','race','occupation','gender','marital','workclass']) #Y axis = Our dependent variable or the income of adult i.e Income df_y = pd.DataFrame(df.income)
Здесь мы разделяем наши данные на зависимую характеристику, которая представляет собой доход как df_y и независимые характеристики, такие как отношения, раса, род занятий, пол, семейное положение, рабочий класс как df_x.
Разделение данных:
#Initialize the linear regression model reg = LogisticRegression() #Split the data into 77% training and 33% testing data #NOTE: We have to split the dependent variables (x) and the target or independent variable (y) x_train, x_test, y_train, y_test = train_test_split(df_x, df_y, test_size=0.33, random_state=42)
Начнем с вызова функции LogisticRegression () из библиотеки scikit и присвоения ее переменной reg. Затем мы разделяем наши данные на набор тестов и обучаем набор с помощью train_test_split (), который помогает лучше обучить модель и проверить ее производительность. test_size = 0,33 создает набор тестовых данных с 33% имеющихся у нас данных, а оставшиеся 77% процентов будут нашим обучающим набором для обучения нашей модели. Эта функция разделения возвращает нам пару из набора поездов (x_train, y_train) и пару из набора тестов (x_test, y_test).
#Train our model with the training data reg.fit(x_train, y_train) #print our price predictions on our test data y_pred = reg.predict(x_test)
Затем мы обучаем нашу модель с помощью функции .fit (), снабжая ее нашими наборами поездов, и получаем выходные прогнозы с помощью функции .predict (), загружая наборы тестов.
Прогноз и оценка:
Теперь давайте проверим, как работает наша модель.
#feeding the predict function with our test values in the format [['relationship','education','race','occupation','gender','marital','workclass']] reg.predict([[1,7,3,7,0,2,0]])
мы предоставили тестовые данные для нашей модели для прогнозирования на основе предположений, которые мы сделали ранее с помощью визуализации данных. Поскольку мы предположили, что доход человека будет более 50K, если статус отношений 1 или 4, образование 7 или 10, раса 1 или 3, род занятий 5 или 7, пол мужской, т.е. 0, семейное положение 2 или 6, а workclass - 0 или 2. Итак, мы правильно предсказали, что человек с такими характеристиками наверняка сможет заработать более 50 тысяч, и вернули прогнозное значение 1.
мы можем оценить нашу модель, используя различные метрики оценки модели, такие как точность, предоставляемую библиотекой sklearn Python.
#printing the accuracy values print("Accuracy:",metrics.accuracy_score(y_test, y_pred))
мы достигли значения точности 76%, что хорошо для любой модели прогнозирования машинного обучения, особенно для задачи регрессии классификации.
Заключение:
Наконец-то! мы успешно создали модель прогнозирования классификационного машинного обучения с использованием Python и его мощных библиотек, которая предсказывает, будет ли доход данного взрослого ›50 000 или нет.
Я надеюсь, что вы потратите 15 минут качественного времени на чтение этой статьи и получите некоторые знания о том, что такое анализ данных, как создавать модели машинного обучения и как python помогает нам создавать эти модели. Эта статья может стать первым шагом на пути к машинному обучению, но помните слова Марка Твена:
«Секрет успеха в том, чтобы начать»
Если вы здесь, я предполагаю, что вы энтузиаст программирования и хотите узнать о машинном обучении. Я бы посоветовал вам начать с изучения основных концепций Python, если вы не знакомы с простыми и элегантными учебниками по Python w3schools - лучшее место для изучения основ.
Как только вы освоите основы, не торопитесь изучать все библиотеки, доступные на python, они вам не нужны, начните с некоторых из самых важных для ML, таких как Numpy, Pandas с промежуточным уровень знаний об этих библиотеках достаточно высок, чтобы начать карьеру специалиста по данным.
Kaggle - хороший обучающий ресурс по машинному обучению, где вы можете изучить и попрактиковаться в более чем 19 000 общедоступных наборов данных. Как только вы ознакомитесь с основами, которые вы узнали в этой статье, я предлагаю вам отправиться на легендарное соревнование по предсказаниям Kaggle Титаник, которое представляет собой проблему классификации с некоторыми замечательными блокнотами, чтобы учиться и начинать кодировать свою модель предсказания.
Сообщите мне о любых предложениях или улучшениях в комментариях.
Удачного обучения !! Прощай.