Анализ цен на жилье: расширенные методы регрессии

Оглавление:

  1. ДОМ ПРОБЛЕМА
  2. АНАЛИЗ ИССЛЕДОВАТЕЛЬСКИХ ДАННЫХ
  3. ПОДГОТОВКА ДАННЫХ
  4. ПОСТРОЕНИЕ МОДЕЛЕЙ
  5. ОБЗОР ЭФФЕКТИВНОСТИ МОДЕЛИ
  6. МОДЕЛИРОВАНИЕ ОКОНЧАТЕЛЬНОЙ ПОДАЧИ

1. ДОМАШНЯЯ ПРОБЛЕМА

Описание

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

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

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

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

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

2. АНАЛИЗ ИССЛЕДОВАТЕЛЬСКИХ ДАННЫХ

Описание данных

Как вы можете видеть на изображении, используется набор данных House Prices: Advanced Regression Techniques, который содержит 4 файла.

  1. train.csv (в котором есть ваши тренировочные данные).
  2. test.csv (в котором есть ваши данные тестирования).
  3. data_description.txt (который содержит описание атрибутов данных, например, какими категориями обладает тот или иной атрибут).
  4. sample_submission.csv (это пример файла отправки, чтобы вы знали, что ваш прогнозируемый файл должен иметь следующий формат).

После извлечения файла вот данные поезда

Анализ данных

df.isnull().sum().sort_values(ascending=False)

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

  1. MiscFeature: дополнительная функция, не включенная в другие категории. В этой категории максимальное количество записей равно Null.
  2. Электрический столбец не повышает точность модели. поэтому мы можем удалить его в выборе функций

Примечание. Спальня и кухня не являются параметрами в наборе данных, это просто сокращения в данных.

Столбец Переулок также пуст и также не повышает точность модели.

После попытки найти

1. Категориальные значения, имеющие одно значение, которое не будет полезным

droped_columns_2=[]
for col , num in zip( df.astype('object').nunique().index,df.astype('object').nunique().values):
    if num ==1:
        droped_columns_2.append(col)

droped_columns_2

Вывод ['Аллея', 'БассейнQC', 'Забор', 'Разное']

2. Удаление повторяющихся столбцов

К счастью, такого значения не найдено 😎

df.duplicated().sum()

давайте попробуем изучить числовые функции

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

Используется Тепловая карта для выбора функций

Особенности высокой корреляции

['YearBuilt','GarageYrBlt'] ['1stFlrSF','TotalBsmtSF'] ['GarageCars' ,'GarageArea'] ['GrLivArea','TotRmsAbvGrd']

df.drop(columns=['GarageYrBlt','1stFlrSF','GarageArea','TotRmsAbvGrd'],inplace=True)

Ловля фазы выброса 🧐

Выбросы — это точки данных, которые значительно отклоняются от общей картины набора данных. Это наблюдения, которые далеки от других наблюдений и могут иметь несоразмерное влияние на статистический анализ.

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

Эти функции имеют TotalBsmtSF, GrLivArea много отклонений 🤧🤧

Давайте поймаем их😎

df.drop(columns='Id',inplace= True)
mask1=df['TotalBsmtSF']<2050
mask2=df['TotalBsmtSF']>100
mask3=df['GrLivArea']<2800
mask4=df['GarageCars']<3.8
mask5=df['OverallQual']>1.8
DF=df[mask1&mask2 &mask3&mask4&mask5]

Давайте рассмотрим асимметрию данных

Асимметрия — это статистическая мера, которая количественно определяет асимметрию распределения вероятностей в наборе данных. Он предоставляет информацию о форме распределения и степени его отклонения от симметричной колоколообразной кривой.

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

Note: 
Data is symmetrical: skewness is between -0.5 and 0.5
Data is slightly skewed: skewness is between -1 and -0.5 or 0.5 and 1
Data is highly skewed: skewness is less than -1 or greater than 1.

# select columns with skew()>1 or <1

sk=[]
for i in df.drop(columns=[ 'YearBuilt','YearRemodAdd']).select_dtypes('number').columns:
    if ((df[i].skew()>1) or (df[i].skew()<1)):
        sk.append(i)

# update values of skew data from x to log(x)
np.seterr(divide = 'ignore')
sk_=pd.DataFrame(np.select([DF[sk]==0, DF[sk] > 0, DF[sk] < 0], [0, np.log(DF[sk]), np.log(DF[sk])]),columns=sk).set_index(DF.index)
df_skew=DF.drop(columns=sk).set_index(DF.index)

df_skew=pd.concat([df_skew,sk_],axis=1)
X_train_skew=df_skew.drop(columns='SalePrice')


# select columns with skew()>1 or <1

sk_t=[]
for i in test.drop(columns=[ 'YearBuilt','YearRemodAdd']).select_dtypes('number').columns:
    if ((test[i].skew()>1) or (test[i].skew()<1)):
        sk_t.append(i)
sk_t=pd.DataFrame(np.select([test[sk_t]==0, test[sk_t] > 0, test[sk_t] < 0], [0, np.log(test[sk_t]), np.log(test[sk_t])]),columns=sk_t).set_index(test.index)
df_skew_t=test.drop(columns=sk_t).set_index(test.index)

df_skew_t=pd.concat([df_skew_t,sk_t],axis=1)
X_test_skew=df_skew_t.reindex(columns=X_train_skew.columns)

Но я не применял искаженные данные к реальным данным, так как я хочу обучать модель с помощью этих данных и реальных данных (я сделал это сам, и это дает больше точности с новыми обновлениями). Я хочу, чтобы это работало лучше, чем реальные данные, если нет, мы продолжим, поскольку ситуация не меняется😋.

3. ПОДГОТОВКА ДАННЫХ

Описание

Вставка отсутствующих значений

Отдельно рассматриваются пропущенные значения категориальных признаков.

# start with Categorical Features
from sklearn.impute import SimpleImputer
imp_cat = SimpleImputer(strategy="most_frequent")

X_Cat= df_final.select_dtypes('object')
X_data_cat = imp_cat.fit_transform(X_Cat)

С числовыми данными разбирается отдельно.

# Numerical Features
from sklearn.impute import SimpleImputer
imp_num = SimpleImputer()

X_num=df_final.select_dtypes('number')
X_data_num = imp_num.fit_transform(X_num)

Горячее кодирование

«Горячие коты, крутые собачки! Быстрое кодирование: сделать категориальные данные удобными для машинного обучения. Никакой предвзятости, просто отдельные столбцы. Мяу, лай, гав! Превратим категории в числовые лапы. Больше никаких катастроф в алгоритмах! Воспользуйтесь мощью «горячего» кодирования и создайте идеальные прогнозы!»

from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder(drop='first',sparse_output=False)
df_ohe = ohe.fit_transform(X_Cat)

#At the End the concatenated all the data using numpy.concatenate()
X_Data=np.concatenate([df_ohe,X_data_num],axis=1)

4. ПОСТРОЕНИЕ МОДЕЛЕЙ

Head-Up реализовал все известные мне модели машинного обучения для этих данных и дал свой анализ того, насколько они соответствуют данным, и в конце предсказал лучшую модель для среднеквадратичной ошибки (RMSE), возможную для этого набора данных. 🙂🙂

from sklearn.metrics import mean_squared_error,r2_score

# Splitting the Data into train and test data
X_train,X_test,y_train,y_test = train_test_split(X_Data,df['SalePrice'],
                                                test_size=0.2)

Список реализованных моделей

  1. Алгоритм KNN
  2. Наивная модель
  3. Машина опорных векторов (SVM)
  4. Дерево решений
  5. Случайный лес
  6. Усиление градиента

1. Алгоритм КНН

«KNN, дружелюбный сосед машинного обучения. Это простой, но мощный алгоритм. KNN означает k-ближайших соседей. Он классифицирует данные на основе их ближайших соседей в пространстве признаков. Независимо от того, предсказываете ли вы жанры или выявляете аномалии, KNN вас поддержит. Просто посчитайте соседей, найдите консенсус и сделайте точные прогнозы. Это как иметь рядом полезного соседа в мире машинного обучения!»

from sklearn.neighbors import KNeighborsRegressor
knn = KNeighborsRegressor()

Настройка гиперпараметров

error_rate = []
[True, False, ...  ]
# Will take some time
for i in range(1,40):

    knn = KNeighborsRegressor(n_neighbors=i)
    knn.fit(X_train,y_train)
    pred_i = knn.predict(X_test)
    error_rate.append(np.mean(pred_i != y_test))

# Plotting the error rate to infer a value for K-neigbour
plt.figure(figsize=(10,6))
plt.plot(range(1,40),error_rate,color='blue', linestyle='dashed', marker='o',
         markerfacecolor='red', markersize=10)
plt.title('Error Rate vs. K Value')
plt.xlabel('K')
plt.ylabel('Error Rate')

K-neighbour = 2 имеет минимальную частоту ошибок

Примерка модели с K=2

knn3 = KNeighborsRegressor(n_neighbors=2)

knn3.fit(X_train,y_train)
knn_pred = knn.predict(X_test)

print("RMSE of KNN --> ", knn3.score(X_test, y_test)*100)

Вывод: RMSE модели KNN → 63,436252589277544.

Анализ модели: «KNN может столкнуться с проблемой регрессии из-за зависимости от ближайших соседей. Ему не хватает гибкости для фиксации сложных взаимосвязей, что приводит к неоптимальным прогнозам и более высоким значениям RMSE».

2. Наивная модель

«Наивный Байес, «наивная» рок-звезда машинного обучения. Благодаря простому предположению о независимости между функциями он быстро и эффективно классифицирует данные. Это как фокусник, вытаскивающий кроликов из шляпы, предсказывает быстро и легко. От фильтрации спама до анализа настроений, Naive Bayes творит чудеса, что делает его популярным выбором во многих приложениях машинного обучения».

from sklearn.naive_bayes import MultinomialNB
from sklearn.naive_bayes import BernoulliNB
from sklearn.naive_bayes import GaussianNB

Mb = MultinomialNB()
Bb = BernoulliNB()
Gb = GaussianNB()

Подгонка модели к набору данных

Mb.fit(X_train,y_train)
y_pred = Mb.predict(X_test)
print("RMSE on MultinomialNB --> ", Mb.score(X_test, y_test)*100)

Вывод: RMSE для MultinomialNB → 0,3424657534246575

Bb.fit(X_train,y_train)
bb_pred2 = Bb.predict(X_test)
print("RMSE on BernoulliNB --> ", Bb.score(X_test, y_test)*100)

Вывод: RMSE на BernoulliNB → 1,36986301369863.

Gb.fit(X_train,y_train)
y_pred3 = Gb.predict(X_test)
print("RMSE on GaussianNB --> ", Gb.score(X_test, y_test)*100)

Вывод: RMSE на GaussianNB → 1,36986301369863

Анализ модели: «Наивный байесовский подход плохо подходит для регрессии, поскольку он предполагает независимость между признаками и имеет ограниченные возможности для фиксации сложных взаимосвязей, что приводит к низкому среднеквадратичному отклонению в регрессии. Также он используется, когда вы пытаетесь выполнить Сентиментальный анализ».

3. Машина опорных векторов (SVM)

«Машина опорных векторов (SVM) — это мощная модель машинного обучения, которая максимизирует разницу между классами, что делает ее эффективной как для задач классификации, так и для задач регрессии. Он находит оптимальную гиперплоскость для разделения точек данных и может обрабатывать сложные границы решений. SVM достигает замечательной производительности, используя опорные векторы и функции ядра для эффективных и точных прогнозов».

from sklearn import svm
clf = svm.SVC(decision_function_shape='ovo')

Подгонка модели

clf.fit(X_train,y_train)
svm_pred = clf.predict(X_test)

print("RMSE of SVM --> ", clf.score(X_test, y_test)*100)

Вывод: RMSE для SVM → 2,054794520547945

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

4. Дерево решений

«Дерево решений: ваш ИИ-проводник в дебрях данных. Эта модель сопоставляет функции с результатами, принимая решения по отраслям. Он учится на данных и разделяет свой путь к ясности, раскрывая идеи в древовидной структуре. Обладая интуитивно понятным и интерпретируемым характером, дерево решений позволяет нам ориентироваться в сложных данных и делать осознанный выбор».

from sklearn import tree
clf_tree = tree.DecisionTreeRegressor()

Подгонка модели

clf_tree.fit(X_train,y_train)
decision_pred = clf_tree.predict(X_test)

print("RMSE of Decision Tree --> ", clf_tree.score(X_test, y_test)*100)

Вывод: RMSE для SVM → 73,91510370312822

Анализ модели: «Разветвление до низкого RMSE! Деревья решений превосходны в регрессии благодаря своей способности фиксировать нелинейные отношения и обрабатывать как непрерывные, так и категориальные признаки. Рекурсивно разделяя данные, деревья решений создают точные прогнозы, что делает их мощным инструментом для минимизации среднеквадратичной ошибки и получения точных результатов регрессии».

5. Случайный лес

«Природный ансамбль деревьев решений. Эта мощная модель машинного обучения сочетает в себе мудрость многих деревьев, чтобы делать точные прогнозы. Он обрабатывает многомерные данные, избегает переобучения и обеспечивает важность функций. Благодаря случайности и командной работе модель Random Forest представляет собой лес, полный предсказательной силы, покоряющий пустыню данных».

from sklearn.ensemble import RandomForestRegressor
clf_random_tree = RandomForestRegressor(max_depth=25, random_state=0,n_estimators=1000)

В гиперпараметре max_depth=25 и n_estimators=1000 были оценены как хорошие для модели.

Подгонка модели к набору данных

clf_random_tree.fit(X_train,y_train)

random_pred = clf_random_tree.predict(X_test)

print("RMSE of Random Forest Model --> ", clf_random_tree.score(X_test, y_test)*100)

Вывод: RMSE модели случайного леса → 86,71510582796937

Анализ модели:«Раскройте потенциал Random Forest! Эта универсальная ансамблевая модель отлично справляется с задачами регрессии, обеспечивая впечатляющие показатели среднеквадратичной ошибки. Комбинируя несколько деревьев решений и агрегируя их прогнозы, Random Forest фиксирует сложные взаимосвязи и уменьшает переоснащение. Он обрабатывает многомерные данные, обрабатывает пропущенные значения и предоставляет информацию о важности функций. Испытайте магию Random Forest и добейтесь замечательных результатов регрессии с минимальными трудностями».

6. Усиление градиента

«Улучшайте свои прогнозы с помощью Gradient Boosting! Эта мощная модель машинного обучения объединяет слабых учеников в сильных. Он итеративно улучшает прогнозы, сосредотачиваясь на предыдущих ошибках. Gradient Boosting обрабатывает различные типы данных, обрабатывает сложные взаимодействия и превосходно справляется с задачами регрессии и классификации. Приготовьтесь поднять свои модели на новый уровень с помощью Gradient Boosting!»

from sklearn.datasets import make_hastie_10_2
from sklearn.ensemble import GradientBoostingRegressor
clf_boosting = GradientBoostingRegressor(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)

В гиперпараметре max_depth=1, n_estimators=1000, learning_rate= 1,0 было оценено как хорошее для модели.

Подгонка к набору данных

clf_boosting.fit(X_train,y_train)
boosting_pred = clf_boosting.predict(X_test)

print("RMSE on Gradient Boosting--> ", clf_boosting.score(X_test, y_test)*100)

Вывод: RMSE модели повышения градиента → 86,71510582796937

Анализ модели: «Ощутите исключительную регрессию с помощью Gradient Boosting! Эта универсальная модель использует возможности бустинга для многократного уточнения прогнозов и минимизации среднеквадратичной ошибки (RMSE). Эффективно фиксируя сложные отношения в данных, Gradient Boosting превосходно справляется с задачами регрессии, обеспечивая точные и надежные результаты. Попрощайтесь с высоким среднеквадратичным отклонением и воспользуйтесь мощью Gradient Boosting для исключительной производительности регрессии!»

также становится наиболее подходящим

5. ОБЗОР ХАРАКТЕРИСТИК МОДЕЛИ

import math

mse_values = [0.8640396610218306, 0.8705751147837917, 0.8118592767468824, -0.18955898672630567, 0.2003347520496762, 0.6470277623092952]

best_r2_score = -np.inf
best_mse = np.inf

for mse in mse_values:
    r2_score = 1 - (mse / np.var(y_test))
    
    if r2_score > best_r2_score:
        best_r2_score = r2_score
        best_mse = mse

print(f"Best R2 score: {best_r2_score:.3f} (corresponding to MSE: {best_mse:.3f})")

Лучшая модель — повышение градиента с среднеквадратичной ошибкой86,059%

6. МОДЕЛИРОВАНИЕ ОКОНЧАТЕЛЬНОЙ ПОДАЧИ

Прогнозирование окончательного представления с использованием алгоритма повышения градиента

testing = clf_boosting.predict(X_test)
output = pd.DataFrame(testing).astype(int)

# Saving the Output in the form of .csv
output.columns = ['SalePrice']
Id_list = np.arange(1461,2920).astype(int)
Id = pd.DataFrame(Id_list)
Id.columns = ['Id']
submission = pd.concat([Id, output], axis = 1)
submission.to_csv('/content/drive/MyDrive/house-prices-advanced-regression-techniques/submission.csv', index = False, header = True)

Обо мне

Большое спасибо, что прочитали мою статью! Привет, я Акил Шарма, студент IT&MI в Центре кластерных инноваций Университета Дели. Если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь обращаться ко мне!

Напишите мне по адресу [email protected] и не стесняйтесь связаться со мной в LinkedIn!

следуйте за мной на Github: https://github.com/Akhil-Sharma30

подписывайтесь на меня в Twitter: DevelopAkhil.twitter

Блокнот Colab: https://github.com/Akhil-Sharma30/House-Pricing-Analysis/blob/main/house_prices_Analysis.ipynb