Пошаговый подход

Мы собираемся реализовать линейную регрессию для набора данных Boston Housing.

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

Импорт необходимых библиотек

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

Загрузка нашего набора данных во фрейм данных

data = pd.read_csv("boston.csv")

Чтобы получить основные сведения о нашем наборе данных Boston Housing, например нулевые или отсутствующие значения, типы данных и т. Д., Мы можем использовать .info (), как показано ниже:

data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 506 entries, 0 to 505
Data columns (total 15 columns):
Unnamed: 0    506 non-null int64
CRIM          506 non-null float64
ZN            506 non-null float64
INDUS         506 non-null float64
CHAS          506 non-null float64
NOX           506 non-null float64
RM            506 non-null float64
AGE           506 non-null float64
DIS           506 non-null float64
RAD           506 non-null float64
TAX           506 non-null float64
PTRATIO       506 non-null float64
B             506 non-null float64
LSTAT         506 non-null float64
target        506 non-null float64
dtypes: float64(14), int64(1)
memory usage: 59.4 KB

Обработка отсутствующих значений во фрейме данных

Первые 5 строк нашего набора данных возвращаются по умолчанию при использовании метода .head ():

data.head()

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

data.ZN.replace(0, np.nan, inplace = True)
data.CHAS.replace(0, np.nan, inplace = True)

После замены с помощью метода .info () для просмотра сведений об отсутствующих значениях в нашем наборе данных:

data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 506 entries, 0 to 505
Data columns (total 15 columns):
Unnamed: 0    506 non-null int64
CRIM          506 non-null float64
ZN            134 non-null float64
INDUS         506 non-null float64
CHAS          35 non-null float64
NOX           506 non-null float64
RM            506 non-null float64
AGE           506 non-null float64
DIS           506 non-null float64
RAD           506 non-null float64
TAX           506 non-null float64
PTRATIO       506 non-null float64
B             506 non-null float64
LSTAT         506 non-null float64
target        506 non-null float64
dtypes: float64(14), int64(1)
memory usage: 59.4 KB

Вычисление процента отсутствующих значений в нашем наборе данных. Как правило, если имеется 20–25% пропущенных значений, мы можем вменять их разными способами, например средним или медианным.

Но если это нечто большее, лучше удалить эти функции, иначе они могут повлиять на наш результат. Как видно ниже, в обоих «ZN» и «CHAS» отсутствует более 70% данных, поэтому мы удалим обе эти функции.

data.isnull().sum() / len(data) * 100
Unnamed: 0     0.000000
CRIM           0.000000
ZN            73.517787
INDUS          0.000000
CHAS          93.083004
NOX            0.000000
RM             0.000000
AGE            0.000000
DIS            0.000000
RAD            0.000000
TAX            0.000000
PTRATIO        0.000000
B              0.000000
LSTAT          0.000000
target         0.000000
dtype: float64

Удаление столбцов «ZN», «CHAS», а также «Безымянный: 0», как показано ниже:

data = data.drop(['ZN', 'CHAS', 'Unnamed: 0'], axis = 1)

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

data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 506 entries, 0 to 505
Data columns (total 12 columns):
CRIM       506 non-null float64
INDUS      506 non-null float64
NOX        506 non-null float64
RM         506 non-null float64
AGE        506 non-null float64
DIS        506 non-null float64
RAD        506 non-null float64
TAX        506 non-null float64
PTRATIO    506 non-null float64
B          506 non-null float64
LSTAT      506 non-null float64
target     506 non-null float64
dtypes: float64(12)
memory usage: 47.5 KB

Кроме того, чтобы получить основную информацию о наших данных, таких как среднее значение, медиана, количество и т. Д., Мы будем использовать метод .describe (), как показано ниже:

data.describe()

Разделение зависимых и независимых переменных

X = data.iloc[:,:-1]
y = data.iloc[:,-1]

Разделение данных на обучающий набор и тестовый набор

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)

Импорт класса линейной регрессии из sklearn

from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X_train, y_train) # Fitting our model to the training set

Теперь делаю прогнозы с помощью метода .predict ()

y_pred = model.predict(X_test)

Вычислите показатели, чтобы измерить эффективность нашей модели

Здесь мы вычислили среднюю абсолютную ошибку (MAE), среднеквадратичную ошибку (MSE) и среднеквадратичную ошибку (RMSE). Мы также вычислили балл для нашего классификатора.

from sklearn import metrics 
print("MAE", metrics.mean_absolute_error(y_test, y_pred))
print("MSE", metrics.mean_squared_error(y_test, y_pred))
print("RMSE", np.sqrt(metrics.mean_squared_error(y_test, y_pred)))
print("Score:", model.score(X_test, y_test))
MAE 3.773568493778742
MSE 31.332023490151126
RMSE 5.59750153998649
Score: 0.6164944788849184

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

plt.scatter(y_pred, y_test)
plt.show()

Это хороший результат, но вы никогда не будете использовать линейную регрессию в Boston Housing Dataset таким образом, и в большинстве случаев мы будем использовать регуляризацию, которая дополнительно ограничивает коэффициенты модели.

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