Machine Learning, Саморазвитие

Линейная регрессия на заданном наборе данных

Время прочтения: 4 мин.

В качестве данных будет использован data set океанографических исследований, насчитывающий более 800 тыс. строк. Фрагмент csv-файла показан на рисунке ниже. Из атрибутов будут выбраны данные об уровне солености воды и температуре воды.

Импортируем необходимые библиотеки (для примера используется Jupyter Notebook):

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn import preprocessing, svm
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

Затем выполним чтение данных из файла oceanographi.csv и сформируем Data Frame:

# Формируем Data Frame из csv файла
df = pd.read_csv('C:/Users/User/oceanographi.csv')
# Используем только необходимые атрибуты из Data Frame
df_bin = df[["Salinity_water", "Temperature_degreeCelsius"]]
# Переименование столбцов в удобный вид
df_bin.columns = ["Salinity", "Temperature"]
# Выведем на экран первые строки DataFrame
df_bin.head()

Результат работы этого кода:

Давайте теперь посмотрим на имеющийся разброс данных:

# Построение графа разброса данных
sns.lmplot(x ="Salinity", y ="Temperature", data = df_bin, order = 2, ci = None)

Граф разброса имеющихся данных выглядит следующим образом:

Следующим шагом выполним очистку данных от значений NaN или отсутствующих значений.

# Удаление NaN или отсутствующих числовых значений
df_bin.fillna(method ="ffill", inplace = True)

Теперь проводим обучение модели данных:

# Разделение данных на независимые и зависимые переменные
# Преобразование DataFrame в массив numpy
X = np.array(df_bin["Salinity"]).reshape(-1, 1)
y = np.array(df_bin["Temperature"]).reshape(-1, 1)

# Удаление любых строк со значениями NaN
df_bin.dropna(inplace = True)

# Разделение данных на данные для обучения и тестирования
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25)
regr = LinearRegression()
regr.fit(X_train, y_train)
print(regr.score(X_test, y_test))

Вывод результата:

Посмотрим на разброс прогнозируемых значений данных — получим граф, выполнив следующий код:

y_pred = regr.predict(X_test)
plt.scatter(X_test, y_test, color ='b')
plt.plot(X_test, y_pred, color ='k')

plt.show()

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

# Выбор первых 300 строк данных
df_bin300 = df_bin[:][:300]
sns.lmplot(x ="Salinity", y ="Temperature", data = df_bin300,
                                        order = 2, ci = None)

Результат работы этого кода представлен на рисунке ниже:

Как видно из этого графа, первые 300 строк соответствуют линейной регрессии модели.

Далее снова выполним все ранее показанные шаги по обучению модели:

df_bin300.fillna(method ='ffill', inplace = True)

X = np.array(df_bin300["Salinity"]).reshape(-1, 1)
y = np.array(df_bin300["Temperature"]).reshape(-1, 1)

df_bin300.dropna(inplace = True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25)

regr = LinearRegression()
regr.fit(X_train, y_train)
print(regr.score(X_test, y_test))

Вывод результата кода:

Теперь разброс прогнозируемых значений данных будет таким:

y_pred = regr.predict(X_test)
plt.scatter(X_test, y_test, color ='b')
plt.plot(X_test, y_pred, color ='k')

plt.show()

Использованная в приведенном примере библиотека sklearn имеет важные особенности: наличие в ее составе эффективных инструментов для интеллектуального анализа данных, различных алгоритмов классификации, регрессии и кластеризации, включая support vector machines, random forests, gradient boosting, k-means. Эта библиотека доступна всем и может использоваться повторно в различных контекстах. Она построена на основе NumPy, SciPy, matplotlib. Кроме того, у нее отличная документация и активное сообщество для поддержки и развития.

Советуем почитать