Анализ цен на жилье: расширенные методы регрессии
Оглавление:
- ДОМ ПРОБЛЕМА
- АНАЛИЗ ИССЛЕДОВАТЕЛЬСКИХ ДАННЫХ
- ПОДГОТОВКА ДАННЫХ
- ПОСТРОЕНИЕ МОДЕЛЕЙ
- ОБЗОР ЭФФЕКТИВНОСТИ МОДЕЛИ
- МОДЕЛИРОВАНИЕ ОКОНЧАТЕЛЬНОЙ ПОДАЧИ
1. ДОМАШНЯЯ ПРОБЛЕМА
Описание
Попросите покупателя дома описать дом своей мечты, и он, вероятно, не начнет с высоты потолка подвала или близости к железной дороге с востока на запад. Но набор данных этого конкурса игровых площадок доказывает, что на ценовые переговоры влияет гораздо больше, чем количество спален или забор из белого штакетника.
В этом дополнении участникам предоставляется полный набор данных, касающихся цен на жилье. Набор данных включает в себя различные характеристики и атрибуты жилой недвижимости, такие как количество спален, площадь в квадратных метрах, местоположение и другие важные факторы.
Набор данных был тщательно отобран, чтобы обеспечить разнообразное представление домов из разных регионов. Он направлен на то, чтобы охватить реальные сценарии и проблемы, возникающие при точном прогнозировании цен на жилье. Набор данных также содержит дополнительную информацию, такую как даты продаж и цены, что позволяет участникам анализировать тенденции и закономерности с течением времени.
Участникам предлагается использовать передовые методы регрессии для разработки алгоритмов прогнозирования, которые могут точно оценивать цены на жилье на основе заданных характеристик. Цель состоит в том, чтобы создать модели, которые могут хорошо обобщать и эффективно отражать сложные взаимосвязи между независимыми переменными и целевой переменной, которой является цена продажи дома.
Конкурс направлен на то, чтобы продемонстрировать способность надежно прогнозировать цены на жилье с использованием предоставленного набора данных. Успешные модели прольют свет на факторы, существенно влияющие на цены на жилье, и предоставят ценную информацию как специалистам по недвижимости, так и покупателям жилья и продавцам. Кроме того, конкурс способствует обмену инновационными подходами и методами в области регрессионного анализа и исследования рынка жилья.
2. АНАЛИЗ ИССЛЕДОВАТЕЛЬСКИХ ДАННЫХ
Описание данных
Как вы можете видеть на изображении, используется набор данных House Prices: Advanced Regression Techniques, который содержит 4 файла.
- train.csv (в котором есть ваши тренировочные данные).
- test.csv (в котором есть ваши данные тестирования).
- data_description.txt (который содержит описание атрибутов данных, например, какими категориями обладает тот или иной атрибут).
- sample_submission.csv (это пример файла отправки, чтобы вы знали, что ваш прогнозируемый файл должен иметь следующий формат).
После извлечения файла вот данные поезда
Анализ данных
df.isnull().sum().sort_values(ascending=False)
Используя функцию isnull(), мы видим, что максимальное количество записей в столбце PoolQC пусто. Таким образом, мы можем удалить этот столбец из основного набора данных.
- MiscFeature: дополнительная функция, не включенная в другие категории. В этой категории максимальное количество записей равно Null.
- Электрический столбец не повышает точность модели. поэтому мы можем удалить его в выборе функций
Примечание. Спальня и кухня не являются параметрами в наборе данных, это просто сокращения в данных.
Столбец Переулок также пуст и также не повышает точность модели.
После попытки найти →
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)
Список реализованных моделей
- Алгоритм KNN
- Наивная модель
- Машина опорных векторов (SVM)
- Дерево решений
- Случайный лес
- Усиление градиента
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