Введение

Если вы заинтересованы в построении прогностических моделей, но не знаете, с чего начать, эта статья поможет вам создать простую модель линейной регрессии в Python. Я использовал здесь набор данных о конкуренции цен на жилье, доступный на Kaggle. Если вы новичок в области науки о данных, как и я, то Kaggle — хорошее место для начала. Здесь вы можете :

  • Создавайте прогностические модели
  • Соревнуйтесь с другими участниками
  • Получите новые знания о различных видах данных.

Процесс построения любой прогностической модели (не только линейной регрессии), позвольте мне повторить «любая прогностическая модель», будет одинаковым. Его можно разделить на 2 этапа:

  1. Исследовательский анализ данных (EDA)
  2. Построение модели

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

Если сейчас это не имеет для вас смысла, не волнуйтесь, поймите, что каждый столбец данных должен быть числовым (также известно как очистка данных).

Построение модели. После того, как данные очищены, мы можем построить модель на основе данных. Эта модель может быть:

  • Модель классификации бинарного класса (когда цель является бинарной, т.е. имеет только два класса)
  • Модель многоклассовой классификации (когда цель имеет несколько классов)
  • Модель регрессии (когда целью является непрерывная числовая переменная)

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

Чтение данных:

Нам предоставлены два набора данных в формате csv: один для обучения модели train.csv и второй для проверки модели test.csv.

# Importing the essential modules/packages

import numpy as np
import pandas as pd
hp_train = pd.read_csv("House_prices_train.csv")
hp_test = pd.read_csv("House_prices_test.csv")
# Sneakpeak of train data 
print("Shape of training data: ",hp_train.shape) 
hp_train.head()

# Sneakpeak of test data 
print("Shape of test data: ",hp_test.shape) 
hp_test.head()

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

Позволяет быстро определить, какой столбец отсутствует в тестовых данных.

hp_train.columns.difference(hp_test.columns)

Очистка данных:

Давайте объединим данные поезда и теста перед очисткой, при этом…

  1. Вставьте новый столбец с именем «данные». Чтобы после очистки данных мы могли снова разделить их именно так, как было задано.
  2. Вставьте столбец Target в тестовый фрейм данных и заполните его NaN, это гарантирует, что оба набора данных имеют одинаковое и равное количество столбцов.
# Combining train and test data
hp_train["data"] = 'train'
hp_test['data'] = 'test'
hp_test['SalePrice'] = np.nan
hp_test = hp_test[hp_train.columns]
hp = pd.concat([hp_train,hp_test],axis = 0)
print("Shape of combined Data: ",hp.shape)
hp.tail()

Вот так. Мы объединили наборы данных, но чистые ли данные???

cat_cols = hp.select_dtypes(['object']).columns
list(zip(hp[cat_cols].columns,hp[cat_cols].dtypes,hp[cat_cols].nunique()))

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

# Lets check the missing value percentage for categorical column
(hp[cat_cols].isnull().sum())*100/hp.shape[0]

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

По-прежнему категориальные столбцы не являются числовыми, но без пропущенных значений :) Итак, давайте преобразуем все категориальные столбцы в числовые (также известные как фиктивные) с помощью функции 'pandas.get_dummies' и удалив исходный категориальный столбец

# Creating Dummies
dummy_matrix = pd.get_dummies(hp[cat_cols[:-1]])
# Removing original categorical cols
hp.drop(cat_cols[:-1],axis = 1,inplace = True)
hp.shape
print("Shape of dummy matrix: ",dummy_matrix.shape)
dummy_matrix.head()

Давайте объединим эту фиктивную матрицу с нашими данными.

# Concatenating dummies with data
hp = pd.concat([hp,dummy_matrix],axis = 1)
del dummy_matrix
hp.shape
cat_cols = hp.select_dtypes(['object']).columns
list(zip(hp[cat_cols].columns,hp[cat_cols].dtypes,hp[cat_cols].nunique()))

Вуаля! Категориальных столбцов больше не осталось, кроме «данных», которые мы скоро удалим.

Давайте разделим наш чистый поезд и тестовые данные

hp_train = hp[hp["data"]=='train']
hp_test = hp[hp["data"]=='test']
del hp_train['data']
hp_test.drop(['data','SalePrice'],axis = 1,inplace = True)
hp_train.shape,hp_test.shape

Построение модели:

Столбец теста не содержит целевой переменной. Итак, если мы начнем строить модель на всех обучающих данных, то как мы сможем понять, насколько мы далеки от фактических значений. Следовательно, чтобы наблюдать за предварительными показателями, давайте сначала поработаем с обучающими данными, разделив их на две части. Я использую разделение 80%-20%. Вы можете выбрать 90%-10% или 70%-30%

from sklearn.cross_validation import  train_test_split
hp_train_train,hp_train_test = train_test_split(hp_train,test_size = 0.2,random_state = 2)

Теперь разделяем переменные-предикторы (независимые переменные) и переменную ответа (целевую переменную).

# Separating the predictors and response
x_train = hp_train_train.drop("SalePrice",axis = 1)
y_train = hp_train_train['SalePrice']

Пришло время подогнать модель. Мы создаем самую базовую модель (то есть модель линейной регрессии), которая доступна в пакете «sklearn.linear_model» .

from sklearn.linear_model import LinearRegression
lm = LinearRegression()
lm.fit(x_train,y_train)

Вот и все !!! С построением модели покончено, но что эта модель говорит нам

lm.intercept_
list(zip(hp.columns,lm.coef_))

Это даст нам огромный список и покажет зависимости цели от каждой прогнозируемой переменной. Мы построили модель на 80% данных, теперь давайте спрогнозируем цель для остальных на 20% данных.

x_test = hp_train_test.drop("SalePrice",axis = 1)
y_test = hp_train_test['SalePrice']
p_test = lm.predict(x_test)

p_test содержит предсказанное значение.

Предварительный показатель эффективности:

from sklearn.metrics import mean_absolute_error,r2_score
print("Linear_regression_mean_absolute_error:",mean_absolute_error(
y_test,p_test))
residual = p_test - y_test
rmse = np.sqrt(np.dot(residual,residual)/len(p_test))
print("Root_mean_square_error : ",rmse)
r_square = r2_score(y_test,p_test)
print("R-Square of the model : ",r_square)
Output:
mean_absolute_error:  19251.392477943875 
Root_mean_square_error :  37607.52732126701 
R-Square of the model :  0.786428655695136

Теперь у нас есть приблизительное представление о том, как ведет себя наша модель. R-квадрат, равный 0,7846, говорит о том, что доступные переменные-предикторы объясняют поведение цели на 78,4%. Теперь мы можем построить модель на всех обучающих данных и предсказать тестовые данные.

# Now let us build the model on entire training data
x_train = hp_train.drop("SalePrice",axis = 1)
y_train = hp_train["SalePrice"]
lm.fit(x_train,y_train)
p_test = lm.predict(hp_test)
p_test = pd.DataFrame(p_test)
p_test.to_csv("Simple_Linear_regression.csv",index= False)

Это дало мне оценку 0,2009 с рейтингом 3389 в таблице лидеров kaggle.

В моей следующей статье мы обсудим дальнейшее улучшение этой модели. Это улучшение помогло мне поднять свой рейтинг с 3389 до 1299.