МАШИННОЕ ОБУЧЕНИЕ
Реализуйте простую линейную регрессию
С питоном и склеарном
В этом посте я сосредоточусь на контролируемой задаче с непрерывным входным значением. Другими словами, я обучу алгоритм с набором данных, состоящим из известных входных и выходных данных.
В этом первом посте, посвященном машинному обучению, я попытаюсь предсказать эволюцию коронавируса с помощью простого алгоритма линейной регрессии. Цель состоит в том, чтобы двигаться вперед шаг за шагом, чтобы хорошо понять, как повысить эффективность наших прогнозов.
Выберите данные
Я буду использовать данные из https://www.data.gouv.fr/fr/datasets/coronavirus-covid19-evolution-par-pays-et-dans-le-monde-maj-quotidienne/
На этом сайте вы сможете скачать файлы со следующими данными по дате и стране:
- количество дел
- число смерти
- количество исцелений
- уровень смертности
- скорость заживления
- уровень заражения
Для начала попробуем провести простую линейную регрессию только для одной страны в этом файле. Позже мы попробуем добавить некоторые функции из этих данных и из других источников, таких как средняя температура, средняя зарплата и т. д.
Импорт библиотеки
Импорт некоторых библиотек:
- Numpy: базовая библиотека для научных вычислений и науки о данных.
- matplot: Lib для рисования графика
- Panda: загрузка и обработка входных данных
- Sklearn: библиотека ML
- google.colab: использовать Google диск
- datetime: манипулирование датой
import numpy as np import matplotlib.pyplot as plt import pandas as pd from google.colab import drive import datetime
Загрузите и подготовьте данные
Я буду использовать некоторые файлы данных, размещенные на моем диске Google. Первый шаг — смонтировать папку, чтобы иметь возможность извлекать файлы.
drive.mount('/content/drive', force_remount=True)
В этом файле есть даты. Чтобы их было проще использовать, я конвертирую эту дату (строку) в метку времени (число).
convertDate = lambda x : datetime.datetime.strptime(x, "%Y-%m-%d").timestamp()
Теперь откройте свой CSV благодаря read_csv. Заполните четыре параметра:
- путь к вашему файлу, вот путь в моем google doc
- разделитель CSV, здесь «;»
- error_bad_lines=False, чтобы избежать остановки выполнения в случае неверных строк.
- converters={'Date':convertDate} примените конвертер к столбцу Дата
- usecols=[0,1,2,3] позволяют выбирать определенные столбцы. Здесь я использую только первые четыре.
di = pd.read_csv('/content/drive/My Drive/dataML/coronavirus.politologue.com-pays-2020-08-22.csv',";", error_bad_lines=False,converters={'Date':convertDate},usecols=[0,1,2,3])
Сейчас файл почти готов, но еще остались некоторые проблемы со столбцом «Платит». На самом деле в этом столбце у нас есть категориальные данные, а не числовые данные. В этом примере мы просто сохраним данные из Франции и удалим этот столбец.
# Remove all ligne with a value different than "France" in column "Pays" clean_di = di.drop(di[di.Pays != "France"].index) # Remove the column "Pays" clean_di = clean_di.drop(axis=1,labels="Pays")
Задайте параметры линейной регрессии
Теперь я изолирую функции (входные) в векторе x и выходные данные в векторе y. Кроме того, я создаю набор переменных данных для представления глобального набора данных.
dataset = clean_di; x = clean_di.iloc[:, clean_di.columns == 'Infections'].values y = clean_di.iloc[:, clean_di.columns == 'Deces'].values
Разделение набора данных на обучающий набор и тестовый набор
from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 1/6, random_state = 0)
Обучение модели простой линейной регрессии на обучающем наборе
from sklearn.linear_model import LinearRegression regressor = LinearRegression() regressor.fit(x_train, y_train)
визуализация результатов тренировочного набора
plt.scatter(x_train, y_train, color = ‘red’) plt.plot(x_train, regressor.predict(x_train), color = ‘blue’) plt.xlabel(‘Case’) plt.ylabel(‘Death’) plt.show()
Визуализация результатов набора тестов
plt.scatter(x_test, y_test, color = 'red') plt.plot(x_train, regressor.predict(x_train), color = 'blue') plt.xlabel('Case') plt.ylabel('Death') plt.show()
Вывод
Как видите, наш прогноз кажется хорошим, но прогноз не очень хороший. Степень полиномиальной функции аппроксимации недостаточна для получения хороших результатов.
from sklearn.preprocessing import PolynomialFeatures from sklearn.pipeline import make_pipeline x_seq = np.linspace(x.min(),x.max(),300).reshape(-1,1) regressorDegree5 = make_pipeline(PolynomialFeatures(5), LinearRegression()) regressorDegree5.fit(x, y) plt.scatter(x_train, y_train, color = 'red') plt.plot(x_seq, regressorDegree5.predict(x_seq), color = 'blue') plt.xlabel('Case') plt.ylabel('Death') plt.show() plt.scatter(x_test, y_test, color = 'red') plt.plot(x_seq, regressorDegree5.predict(x_seq), color = 'blue') plt.xlabel('Case') plt.ylabel('Death') plt.show()
Ресурсы
Источники
Исполняемый пример на Colab.