Введение
Если вы заинтересованы в построении прогностических моделей, но не знаете, с чего начать, эта статья поможет вам создать простую модель линейной регрессии в Python. Я использовал здесь набор данных о конкуренции цен на жилье, доступный на Kaggle. Если вы новичок в области науки о данных, как и я, то Kaggle — хорошее место для начала. Здесь вы можете :
- Создавайте прогностические модели
- Соревнуйтесь с другими участниками
- Получите новые знания о различных видах данных.
Процесс построения любой прогностической модели (не только линейной регрессии), позвольте мне повторить «любая прогностическая модель», будет одинаковым. Его можно разделить на 2 этапа:
- Исследовательский анализ данных (EDA)
- Построение модели
Исследовательский анализ данных.Перед построением модели мы должны убедиться, что данные, на основе которых мы собираемся построить модель, имеют все числовые столбцы, а также мы должны получить представление о том, что характер каждой функции (например, столбец) и многое другое (это непрерывный процесс обучения).
Если сейчас это не имеет для вас смысла, не волнуйтесь, поймите, что каждый столбец данных должен быть числовым (также известно как очистка данных).
Построение модели. После того, как данные очищены, мы можем построить модель на основе данных. Эта модель может быть:
- Модель классификации бинарного класса (когда цель является бинарной, т.е. имеет только два класса)
- Модель многоклассовой классификации (когда цель имеет несколько классов)
- Модель регрессии (когда целью является непрерывная числовая переменная)
В нашем случае говорят, что мы предсказываем «цену продажи» дома, поэтому мы будем строить регрессионную модель.
Чтение данных:
Нам предоставлены два набора данных в формате 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)
Очистка данных:
Давайте объединим данные поезда и теста перед очисткой, при этом…
- Вставьте новый столбец с именем «данные». Чтобы после очистки данных мы могли снова разделить их именно так, как было задано.
- Вставьте столбец 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.