Пошаговый подход
Мы собираемся реализовать линейную регрессию для набора данных 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. Теперь продолжайте и попробуйте реализовать линейную регрессию для любого набора данных по вашему выбору.