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

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

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

Для этого мы будем использовать набор данных weatherHistory, который доступен здесь.



Мы будем использовать Блокнот Google CoLab для кодирования. Поэтому сначала файл weatherHistory.csv, содержащий набор данных, должен быть сохранен на Google Диске.

Во-первых, давайте импортируем необходимые библиотеки следующим образом.

import pandas as pd
import scipy.stats as stats
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from sklearn.preprocessing import FunctionTransformer
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn import datasets, linear_model
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score, cross_val_predict
from sklearn import metrics

Затем прикрепите диск к ноутбуку следующим образом.

from google.colab import drive
drive.mount("/content/gdrive")

Затем используйте pandas для создания фрейма данных из нашего набора данных в папке данных My Drive.

df = pd.read_csv('/content/gdrive/My Drive/data/weatherHistory.csv')
df.head(5)

Когда приведенный выше код будет выполнен, он отобразит первые пять записей в наборе данных (набор данных содержит 96453 строки и 12 столбцов).

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

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

Как только приведенный выше код будет выполнен, он укажет функции, которые содержат нулевые значения в наборе данных. Как и в приведенных выше выходных данных, только столбец «Тип осадков» в наборе данных содержит нулевые значения.

Как указано выше, количество пустых строк в столбце «Тип осадков» очень мало по сравнению с общим количеством строк в наборе данных. Поэтому мы можем удалить эти записи из набора данных после того, как сделаем копию исходного набора данных.

Затем давайте проверим, есть ли в наборе данных дубликаты.

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

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

Здесь он указывает на точку, значительно удаленную от других точек данных. Его можно либо отбросить, либо заменить на минимальное значение. Давай бросим это.

df3=df2.drop(df2[df2['Humidity'] < 0.01].index)

Мы снова можем проверить это на диаграмме.

Также есть одна точка данных, которая находится значительно дальше от основных точек данных. Его тоже можно отбросить.

df3=df2.drop(df2[df2['Wind Speed (km/h)'] > 60].index)

Здесь также есть точки данных, которые находятся значительно дальше от других точек данных.

Их тоже можно сбросить.

df3=df2.drop(df2[df2['Pressure (millibars)'] < 200].index)

Поскольку Loud Cover содержит только 0 в качестве значения для каждой записи. Громкую обложку можно уронить. Форматированная дата - это уникальное поле для каждой записи. Следовательно, этот столбец также можно опустить. Столбцы «Сводка» и «Сводная информация за день» содержат много похожих записей. Следовательно, один столбец из этих двух может быть удален. Давайте опустим столбец «Сводка за день».

df3=df3.drop(['Formatted Date','Daily Summary','Loud Cover'],axis=1)

Теперь давайте отделим видимую температуру, которая является переменной y (переменная, которая будет прогнозироваться) в нашем наборе данных, от нашего набора данных.

y=df3['Apparent Temperature (C)']
df3=df3.drop(['Apparent Temperature (C)'],axis=1)

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

df3['Precip Type']=df3['Precip Type'].astype('category')
df3['Precip Type']=df3['Precip Type'].cat.codes
df3['Summary']=df3['Summary'].astype('category')
df3['Summary']=df3['Summary'].cat.codes

Затем давайте разделим наш набор данных для целей обучения и тестирования перед другими задачами предварительной обработки и убедимся, что данные не будут использоваться совместно между обучающими и тестовыми наборами данных. Набор данных для обучения используется для обучения модели, а набор данных для тестирования используется для прогнозирования видимой температуры и проверки модели. У нас будет соотношение 0,8: 0,2 между наборами данных для обучения и тестирования.

X_training, X_testing, y_train, y_test = train_test_split(df3, y, test_size=0.2)
X_train=X_training.copy()
X_test=X_testing.copy()

Затем давайте проверим, не искажено ли распределение точек данных в каждой функции. Для этой гистограммы и графика Q-Q можно построить как тестовые, так и обучающие данные. Если данные искажены, их необходимо нормализовать. Это известно как преобразование данных.

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

Скорость ветра также показывает правильный перекос. Применим для этого преобразование квадратного корня.

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

Преобразование также должно быть выполнено с тестовым набором данных.

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

Здесь мы используем стандартизацию для масштабирования.

columnfeatures=['Temperature (C)','Humidity','Wind Speed (km/h)','Wind Bearing (degrees)','Visibility (km)','Pressure (millibars)']
scaler = StandardScaler()
scaler.fit(X_train[columnfeatures])
X_train[columnfeatures]=scaler.transform(X_train[columnfeatures])
X_test[columnfeatures]=scaler.transform(X_test[columnfeatures])

Далее необходимо сделать уменьшение признака.

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

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

Затем давайте посмотрим, как важны характеристики по отношению к переменной y (кажущаяся температура). При необходимости функции, которые имеют меньшее значение для видимой температуры, могут быть опущены. Потому что они очень мало влияют на определение видимой температуры. Если значения в матрице очень близки к 1 или -1, то эта особенность очень важна.

d_data = X_train.copy()
d_data['Apparent Temperature (C)'] = y_train
d_data.head(10)
print(d_data.corr())
sns.heatmap(d_data.corr(),annot=True)

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

Анализ главных компонентов (PCA) также можно использовать для уменьшения количества признаков. Мы будем использовать 7 компонентов.

pca = PCA(n_components=7)
pca.fit(X_train)
X_train_pca = pca.transform(X_train)
X_test_pca = pca.transform(X_test)
pca.explained_variance_ratio_

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

lm = linear_model.LinearRegression()
model = lm.fit(X_train_pca, y_train)
y_hat = lm.predict(X_test_pca)

Давайте рассчитаем среднеквадратичную ошибку (MSE), чтобы оценить сгенерированную модель. При низкой MSE модель можно считать хорошей.

Затем давайте построим график зависимости от прогнозируемых и фактических значений кажущейся температуры.

Затем давайте выполним перекрестную проверку k-Fold, чтобы получить общую точность.

Модель достигла точности 99%.

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

Вы можете получить доступ к записной книжке CoLab отсюда.



Спасибо за чтение !!!