Машинное обучение является одним из наиболее важных понятий в области искусственного интеллекта и информатики, и его важность возрастает с каждым днем ​​в различных областях, его влияние на различные сферы нашей жизни становится все более и более, мы все используем приложения на основе машинного обучения для смартфонов. или фильтры Snapchat и, самое главное, это беспилотные автомобили, которые способны доставить нас к месту назначения без вмешательства человека, просто используя машинное обучение. давайте возьмем академическое определение машинного обучения от Тома Митчелла в 1998 году:

Машинное обучение — это компьютерная программа, которая, как говорят, учится на опыте, если ее производительность улучшилась с опытом, используя наблюдаемые данные, чтобы принимать лучшие решения, обобщая наблюдаемые данные.

Машинное обучение основано на трех основных предположениях: мы не знаем математической формулы задачи, но у нас есть данные о ней и есть закономерность, и мы пытаемся ее найти.

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

как вы можете видеть, цена дома зависит от таких характеристик, как размер дома:

наша цель в ML — найти шаблон или модель, используя эти обучающие данные, эта модель обучается на наборе данных и может прогнозировать цену дома с новыми входными данными:

вот чуть более академическое определение машинного обучения, со слайдов из Sharif Technology University:

1- Неизвестная целевая функция: 𝑓: 𝒳 → 𝒴 Пробел ввода: 𝒳
Пробел вывода: 𝒴

2- Данные обучения: (x1, y1), (x2, y2)… (xn, yn)

3- Выберите формулу 𝑔: 𝒳 → 𝒴, которая аппроксимирует целевую функцию 𝑓, выбранную из набора гипотез H

Парадигмы машинного обучения

в целом ML делится на три:

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

2- Неконтролируемое обучение:в этом типе обучениявходные данные не имеют никаких связанных с ними меток, машина понимает базовую структуру данных, чтобы идентифицировать похожие шаблоны и данные аналогичная природа сгруппирована вместе, в примере с фруктами, поэтому здесь, хотя меток нет, машина понимает, что все яблоки имеют схожую природу, и поэтому они группируются вместе, один из известных алгоритмов в этой части — k- означает.

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

Алгоритм линейной регрессии

очевидно, что мы не можем углубиться во все аспекты машинного обучения в этой статье, но есть книга под названием Распознавание образов и машинное обучение, написанная Кристофером Бишопом. справочник по курсам машинного обучения во многих университетах, и я настоятельно рекомендую вам его прочитать. но в качестве примера мы постараемся дать краткое объяснение простейшего алгоритма ML, чтобы использовать его в наших примерах в следующих частях этой статьи; Итак, давайте начнем, линейная регрессия — один из самых простых алгоритмов в ML, это статистическая модель, которая пытается показать взаимосвязь между двумя зависимыми и независимыми переменными с помощью линейного уравнения и формирует модель прогнозирования, которая может предсказать значение зависимых переменных с помощью новое значение независимых переменных, этот алгоритм в основном используется для прогнозирования влияния особого события на ситуацию, пример алгоритма этого типа: насколько увеличится доход, если мы потратим один миллион долларов на сектор маркетинга ?” этот алгоритм основан на графике, на котором ось x представляет независимые переменные, а ось y представляет зависимую переменную, и есть начальные точки с определенными координатами (x,y), которые используются в качестве обучающих данных, цель состоит в том, чтобы найти уравнение «y=mx+c, которое удовлетворяет этим пунктам, если мы найдем эти m,c этой формулы для каждого независимого variable(x) система может предсказать зависимую переменную(y).

На приведенном выше изображении представлены точки данных и линия, нанесенная как наиболее подходящая линия для этих точек данных. но есть проблема, так как вы можете видеть, что некоторые точки находятся на расстоянии от линии покрытия, что мы называем ошибкой, хорошо, давайте объясним больше, предположим, что значение для входа x1 и система оценивает y1, которое мы называем оценочным значением, разница между оценочным значением и фактическим значением называется ошибкой, и мы должны минимизировать ошибку в системе и найти наилучшую линию соответствия, которая имеет наименьшую ошибку.

Давайте ненадолго окунемся в сладкий мир математики.

предположим, что у нас есть точки, показанные в таблице ниже, которые содержат базовые данные обучения, поскольку вы можете видеть, что каждая точка представлена ​​​​координатами (x, y), наша цель - нарисовать линию, которая максимально соответствует этим точкам. .

Прежде всего, нам нужна линия, поскольку все мы знаем, что уравнение линии имеет вид y=mx+c,котороеm называетсякоэффициент, а c —постоянная или пересечение . поэтому для покрытия линии мы вычисляем ее значение, во-первых, давайте вычислим значение m:

согласно приведенной выше формуле, чтобы вычислить значение m,мы должны сначала вычислить среднее значение x который представлен ẋ, а y представлен Ȳ. то для каждого заданного значения (x, y) в обучающих данных мы должны вычислить значение (x-x̄) и (Y-Ȳ):

затем, подставляя значения в формулу, мы вычисляем значение m:

Сейчас . в формуле y=mx+cу нас есть значение mи/или формула изменена наy=0.4x+cпоэтому время, чтобы нуждаться в значения c,мы можем вычислить c, поместив каждую заданную пару(x,y), но наилучшим способом является использование среднего значения их, у нас ẋ=3 и Ȳ=3,6

x=3,y=3.6

y=0.4x+c

3.6=0.4*3+c

c=2.4

В тренировочной таблице у нас были значения для (x,y), которые являются независимыми переменными, а y является зависимой переменной, теперь давайте вычислим значения y, которые мы называем прогнозируемыми значениями или Yp с заданными значениями x по новой формуле y=0,4x+2,6 :

x=1. ==> Yp=2.8

x=2. ==>Yp=3.2

x=3. ==>Yp=3.6

x=4. ==>Yp=4.0

x=5. ==>Yp=4.4

давайте нанесем линию с заданным x и предсказанными значениями y (Yp):

Метод R-квадрата

есть некоторые параметры измерения для нашего алгоритма ML, которые показывают, насколько наш алгоритм хорош или плох, одним из них является R-Square или r2или коэффициентопределения, а r2 — это статистическая мера того, насколько данные обучения близки к подобранной линии регрессии:

как вы можете понять из приведенной выше формулы, R2 может принимать значения от 0 до 1, линия наилучшего соответствия имеет значение 1, а наихудшая — 0, давайте рассчитаем R2 для наших данных:

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

Среднеквадратическая ошибка (RMSE)

В предыдущих частях был представлен параметр R2, который показывает, насколько хорош наш алгоритм, например, максимальное значение 1 показывает, что у нас есть наиболее подходящая линия регрессии, но есть параметр с именем RMSE, который показывает, насколько плоха наша линия регрессии, есть параметр при расчете RMSE, который представляет собой разницу между прогнозируемым значением и фактическим значением, которое называется остатком.

остаток = (Y-Yp)

просто RMSE - это среднее значение всех квадратов остатков:

В строке R2 RMSE может принимать значения от 0 до 1, но, в отличие от R2, 1 соответствует наихудшему случаю, а 0 — наилучшему.

лучшая линия линейной регрессии имеет R2=1 и RMSE=0

худшая линия линейной регрессии имеет R2=0 и RMSE=1

но в реале, наверное, в реале эти две ситуации встречаются редко.

Apache Spark-ML

если вы быстро посмотрите на таблицу «Таблица коэффициентов», в таблице всего 5 строк и не менее 20 операций, необходимых только для вычисления коэффициента, предположим, что у нас есть десять миллионов обучающих данных?! проблема стала очень страшной, теперь мы не рассматривали такие вопросы, как загрузка большого файла и нормализация данных и т. д., но не беспокойтесь об этом, есть инструменты, которые делают эту работу за нас, и нам нужно просто дать им данные и получить необходимую информацию от них.

spark-ml — один из известных инструментов в этой области, я уже написал статью под названием Магия искры Apache в java и подробно рассказал о искре и ее архитектуре, поэтому сейчас в этой статье я не хочу чтобы углубиться в детали архитектуры spark, и я просто ссылаюсь на содержимое, связанное с spark-ml.

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

spark-ml имеет 5 основных концепций:

Набор данных: этоподкласс schemaRDD и, конечно, RDD, который может содержать различные типы данных, такие как числа, векторы, тексты, предикации. и метки. Набор данных может поступать из базы данных без SQL, может поступать из HDFS, может поступать из корзины Amazon s3 или Google GCS.

Фрейм данных — это место, куда вы загружаете свои наборы данных, чтобы загрузить их.

Преобразователь: это компонент, который принимает фрейм данных и преобразует его в другой фрейм данных, например, ваш фрейм входных данных содержит текст, но преобразователь помечает его символом « ' », а на выходе остается кадр данных, но содержит строки токенов. в одном фрейме данных должно быть несколько преобразователей.

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

Конвейер: это цепочка, которая содержит несколько преобразователей и оценщиков.

Как упоминалось ранее в этом разделе, spark-ml предоставляет унифицированные API, что означает, что его можно интегрировать со многими платформами и языками программирования, такими как Java и Python, оба языка программирования очень популярны среди программистов, но в этой статье мы сосредоточимся на python. из-за его некоторых особенностей для ИИ.

PySpark

PySpark — это интерфейс для apache spark на Python и часто используется для масштабной обработки данных и машинного обучения, при скачивании и установке apache-spark по умолчанию содержит PySpark, кроме того, его можно скачать отдельно.

Подготовка и установка

Академическая и теоретическая речь позволяет углубиться в кейс, но прежде чем приступить к нему, нам нужно наточить свой топор. нам нужно установить некоторые инструменты, прежде чем приступить к реализации нашего тематического исследования:

1- Установите Java (не менее 8)

2- Установите Python3

3-Установить Apache Spark(у меня уже есть тема про него здесь)

4-Установите Anaconda отсюда

5-для использования искры в Pyspark или даже в java нам нужно установить инструмент поиска искры (есть альтернативный способ, но я пробовал, и я думаю, что найти искру проще). для установки просто выполните следующую команду:

pip install findspark

6- добавьте следующие переменные в ваши системные переменные:

export SPARK_HOME=Spark installation root
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
export PYSPARK_PYTHON=Python3 installation path
export PYSPARK_DRIVER_PYTHON='jupyter'
export PYSPARK_DRIVER_PYTHON_OPTS='notebook --no-browser --port=8889

7- Перейдите в папку «sbin» в пути установки Spark и запустите искру в режиме мастера с помощью «./start-master.sh»:

(base) rezas-MacBook-Pro:sbin aa123456$ ./start-master.sh
starting org.apache.spark.deploy.master.Master, logging to /Users/aa123456/softwares/spark-3.3.0-bin-hadoop3/logs/spark-aa123456-org.apache.spark.deploy.master.Master-1-rezas-MacBook-Pro.local.out
(base) rezas-MacBook-Pro:sbin aa123456$

теперь Spark запущен, и вы можете увидеть его по адресу http://localhost:8080/ :

8- открыть анаконду и запустить блокнот Юпитер:

ХОРОШО. Готов к взлету!

Тематическое исследование

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

идет обучение, данные из Kaggle:

Коды

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

Первая часть нашего кода инициализирует find spark и импортирует связанные библиотеки:

import findspark
findspark.init()

Теперь пришло время инициализировать искру и загрузить набор данных:

#Model Initialization
import pyspark
from pyspark.sql import SparkSession
from pyspark import SQLContext, SparkConf, SparkContext
spark=SparkSession.builder.appName('housing_price_model').getOrCreate()
#create spark dataframe of input csv file
df=spark.read.csv('/Users/aa123456/softwares/datasets/Real estate.csv',inferSchema=True,header=True)

эта часть создает фрейм данных с именем «df», и мы хотим убедиться, что искра загрузила правильный набор данных, давайте распечатаем 5 строк набора данных с помощью следующего кода:

df.show(5)

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

#Feature Extraction
from pyspark.ml.linalg import Vectors
from pyspark.ml.feature import VectorAssembler
assembler=VectorAssembler(inputCols=['X1 transaction date','X2 house age','X3 distance to the nearest MRT station','X4 number of convenience stores','X5 latitude','X6 longitude'],
                          outputCol='features')
output=assembler.transform(df)
output.select('features','Y house price of unit area').show()

помните, что show() может отображать только 20 строк:

На этом этапе нам нужно создать обучающие данные и тестовые данные для следующих шагов:

final_data=output.select('features','Y house price of unit area')
train_data,test_data=final_data.randomSplit([0.7,0.3])

Теперь все готово для построения нашей модели линейной регрессии, давайте сделаем это:

from pyspark.ml.regression import LinearRegression
house_lr=LinearRegression(featuresCol='features',labelCol='Y house price of unit area')
trained_house_model=house_lr.fit(train_data)

Сделанный! у нас есть модель линейной регрессии, и мы просто печатаем коэффициенты и прерываем:

print('coefficnets :',trained_house_model.coefficients)
print('intercepts :',trained_hose_model.intercep
#result :
coefficnets : 
[6.445864330874801,-0.29446624440862035,-0.004377161073108364,1.3076835396771007,230.002861469099,-18.8918499250904]
intercepts : -16381.12667821402

Теперь мы можем сравнить наши прогнозируемые значения с фактическими значениями и распечатать результат:

pred = trained_house_model.evaluate(test_data)
pred.predictions.show()

Оценка модели:

для оценки нашей модели нам нужно рассчитать «r2» и «RSME», этот параметр просто рассчитывается с помощью следующих кодов:

house_results=trained_house_model.evaluate(train_data)
  
print('r2:',house_results.r2)
print('RSME  :',house_results.meanSquaredError)
#result
r2: 0.5829491716773456
RSME  : 83.60175551791716

Ссылки

Оценка моделей линейной регрессии с использованием RMSE и R²

"Линейная регрессия"

Линейная регрессия в Python | Алгоритм машинного обучения