Toutoum/ML_Model
0
1# -- coding: utf-8 --2"""Housing_Price_Prediction_2"""3 4import warnings5warnings.filterwarnings('ignore')6 7import numpy as np8import pandas as pd9import matplotlib.pyplot as plt10import seaborn as sns11 12# Load the dataset13housing = pd.read_csv("Housing.csv")14 15# Check the head of the dataset16print(housing.head())17 18# Data Inspection19print(housing.shape)20print(housing.info())21print(housing.describe())22 23# Checking Null values24print(housing.isnull().sum()*100/housing.shape[0])25 26# Outlier Analysis27import seaborn as sns28import matplotlib.pyplot as plt29 30# Assuming housing is the DataFrame containing your data31 32# Create subplots33fig, axs = plt.subplots(2, 2, figsize=(12, 10))34 35# Boxplot for 'price'36sns.boxplot(x=housing['price'], ax=axs[0, 0])37 38# Boxplot for 'area'39sns.boxplot(x=housing['area'], ax=axs[0, 1])40 41# Boxplot for 'bedrooms'42sns.boxplot(x=housing['bedrooms'], ax=axs[1, 0])43 44# Boxplot for 'bathrooms'45sns.boxplot(x=housing['bathrooms'], ax=axs[1, 1])46 47plt.tight_layout()48 49# Outlier treatment for price50Q1 = housing.price.quantile(0.25)51Q3 = housing.price.quantile(0.75)52IQR = Q3 - Q153housing = housing[(housing.price >= Q1 - 1.5*IQR) & (housing.price <= Q3 + 1.5*IQR)]54 55# Outlier treatment for area56Q1 = housing.area.quantile(0.25)57Q3 = housing.area.quantile(0.75)58IQR = Q3 - Q159housing = housing[(housing.area >= Q1 - 1.5*IQR) & (housing.area <= Q3 + 1.5*IQR)]60import seaborn as sns61import matplotlib.pyplot as plt62 63# Assuming housing is the DataFrame containing your data64 65# Create subplots66fig, axs = plt.subplots(2, 2, figsize=(12, 10))67 68# Boxplot for 'price'69sns.boxplot(x=housing['price'], ax=axs[0, 0])70 71# Boxplot for 'area'72sns.boxplot(x=housing['area'], ax=axs[0, 1])73 74# Boxplot for 'bedrooms'75sns.boxplot(x=housing['bedrooms'], ax=axs[1, 0])76 77# Boxplot for 'bathrooms'78sns.boxplot(x=housing['bathrooms'], ax=axs[1, 1])79 80plt.tight_layout()81plt.show()82 83 84# Visualizing Categorical Variables85plt.figure(figsize=(20, 12))86plt.subplot(2,3,1)87sns.boxplot(x = 'mainroad', y = 'price', data = housing)88plt.subplot(2,3,2)89sns.boxplot(x = 'guestroom', y = 'price', data = housing)90plt.subplot(2,3,3)91sns.boxplot(x = 'basement', y = 'price', data = housing)92plt.subplot(2,3,4)93sns.boxplot(x = 'hotwaterheating', y = 'price', data = housing)94plt.subplot(2,3,5)95sns.boxplot(x = 'airconditioning', y = 'price', data = housing)96plt.subplot(2,3,6)97sns.boxplot(x = 'furnishingstatus', y = 'price', data = housing)98plt.show()99 100plt.figure(figsize = (10, 5))101sns.boxplot(x = 'furnishingstatus', y = 'price', hue = 'airconditioning', data = housing)102plt.show()103 104# Data Preparation105varlist = ['mainroad', 'guestroom', 'basement', 'hotwaterheating', 'airconditioning', 'prefarea']106 107def binary_map(x):108 return x.map({'yes': 1, "no": 0})109 110housing[varlist] = housing[varlist].apply(binary_map)111 112# Dummy Variables113status = pd.get_dummies(housing['furnishingstatus'], drop_first = True)114housing = pd.concat([housing, status], axis = 1)115housing.drop(['furnishingstatus'], axis = 1, inplace = True)116 117# Splitting the Data into Training and Testing Sets118from sklearn.model_selection import train_test_split119 120np.random.seed(0)121df_train, df_test = train_test_split(housing, train_size = 0.7, test_size = 0.3, random_state = 100)122 123# Rescaling the Features124from sklearn.preprocessing import MinMaxScaler125 126scaler = MinMaxScaler()127num_vars = ['area', 'bedrooms', 'bathrooms', 'stories', 'parking','price']128df_train[num_vars] = scaler.fit_transform(df_train[num_vars])129 130plt.figure(figsize = (16, 10))131sns.heatmap(df_train.corr(), annot = True, cmap="YlGnBu")132plt.show()133 134# Dividing into X and Y sets for the model building135y_train = df_train.pop('price')136X_train = df_train137 138# Model Building with RFE139from sklearn.feature_selection import RFE140from sklearn.linear_model import LinearRegression141 142lm = LinearRegression()143lm.fit(X_train, y_train)144 145rfe = RFE(estimator=lm, n_features_to_select=6)146rfe = rfe.fit(X_train, y_train)147 148col = X_train.columns[rfe.support_]149 150# Building model using statsmodel151import statsmodels.api as sm152 153X_train_rfe = X_train[col]154X_train_rfe = sm.add_constant(X_train_rfe)155 156lm = sm.OLS(y_train, X_train_rfe).fit()157print(lm.summary())158 159# Calculate the VIFs for the model160from statsmodels.stats.outliers_influence import variance_inflation_factor161 162vif = pd.DataFrame()163X = X_train_rfe164vif['Features'] = X.columns165vif['VIF'] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]166vif['VIF'] = round(vif['VIF'], 2)167vif = vif.sort_values(by = "VIF", ascending = False)168print(vif)169 170# Residual Analysis171y_train_price = lm.predict(X_train_rfe)172res = (y_train_price - y_train)173 174fig = plt.figure()175sns.distplot((y_train - y_train_price), bins = 20)176fig.suptitle('Error Terms', fontsize = 20)177plt.xlabel('Errors', fontsize = 18)178plt.scatter(y_train, res)179plt.show()180 181# Model Evaluation182num_vars = ['area','stories', 'bathrooms', 'airconditioning', 'prefarea','parking','price']183df_test[num_vars] = scaler.fit_transform(df_test[num_vars])184 185y_test = df_test.pop('price')186X_test = df_test187 188X_test = sm.add_constant(X_test)189X_test_rfe = X_test[X_train_rfe.columns]190y_pred = lm.predict(X_test_rfe)191 192from sklearn.metrics import r2_score193print(r2_score(y_test, y_pred))194 195fig = plt.figure()196plt.scatter(y_test, y_pred)197fig.suptitle('y_test vs y_pred', fontsize=20)198plt.xlabel('y_test', fontsize=18)199plt.ylabel('y_pred', fontsize=16)200 201# Additional Models (Ridge, Lasso, Gradient Boosting, XGBoost, etc.)202from sklearn.linear_model import Ridge203from sklearn.model_selection import GridSearchCV204from sklearn.ensemble import GradientBoostingRegressor205from sklearn.preprocessing import StandardScaler206from sklearn.linear_model import Lasso207from sklearn.ensemble import RandomForestRegressor, StackingRegressor208import xgboost as xgb209 210# Ridge Regression211parameters = {'alpha': [0.1, 1, 10, 100]}212ridge = Ridge()213grid_search = GridSearchCV(ridge, parameters, cv=5, scoring='neg_mean_squared_error')214grid_search.fit(X_train, y_train)215best_ridge = grid_search.best_estimator_216 217# Gradient Boosting Regressor218gbr = GradientBoostingRegressor(n_estimators=100, learning_rate=0.1, max_depth=3)219gbr.fit(X_train, y_train)220print(gbr.score(X_train, y_train))221 222# Lasso Regression223lasso = Lasso(alpha=0.01)224lasso.fit(X_train, y_train)225print(lasso.score(X_train, y_train))226 227# Stacking Regressor228estimators = [('rf', RandomForestRegressor(n_estimators=10)),229 ('gb', GradientBoostingRegressor(n_estimators=10))]230 231stack_reg = StackingRegressor(estimators=estimators, final_estimator=Ridge())232stack_reg.fit(X_train, y_train)233print(stack_reg.score(X_train, y_train))234 235# XGBoost Regressor236xg_reg = xgb.XGBRegressor(objective ='reg:squarederror', n_estimators=100, seed=42)237xg_reg.fit(X_train, y_train)238print(xg_reg.score(X_train, y_train))239 240 241 242import gradio as gr243import pandas as pd244import numpy as np245from sklearn.preprocessing import MinMaxScaler246import xgboost as xgb247from sklearn.model_selection import train_test_split248 249# Load and preprocess the data250housing = pd.read_csv("Housing.csv")251 252# Define binary features253varlist = ['mainroad', 'guestroom', 'basement', 'hotwaterheating', 'airconditioning', 'prefarea']254 255# Apply binary mapping256def binary_map(x):257 return x.map({'yes': 1, 'no': 0})258 259housing[varlist] = housing[varlist].apply(binary_map)260status = pd.get_dummies(housing['furnishingstatus'], drop_first=True)261housing = pd.concat([housing, status], axis=1)262housing.drop(['furnishingstatus'], axis=1, inplace=True)263 264# Define numerical features265num_vars = ['area', 'bedrooms', 'bathrooms', 'stories', 'parking']266 267# Split data into training and test sets268df_train, df_test = train_test_split(housing, train_size=0.7, test_size=0.3, random_state=100)269 270# Scale the numerical features271scaler = MinMaxScaler()272df_train[num_vars] = scaler.fit_transform(df_train[num_vars])273df_test[num_vars] = scaler.transform(df_test[num_vars])274 275# Separate features and target276y_train = df_train.pop('price') # 'price' is the target variable277X_train = df_train278 279# Train the model using XGBoost280xg_reg = xgb.XGBRegressor(objective='reg:squarederror', n_estimators=100, seed=42)281xg_reg.fit(X_train, y_train)282 283# Prediction function284def predict_house_price(area, bedrooms, bathrooms, stories, parking, mainroad, guestroom, basement, hotwaterheating, airconditioning, prefarea):285 try:286 # Create a DataFrame with the input features287 input_df = pd.DataFrame({288 'area': [area],289 'bedrooms': [bedrooms],290 'bathrooms': [bathrooms],291 'stories': [stories],292 'parking': [parking],293 'mainroad': [1 if mainroad else 0],294 'guestroom': [1 if guestroom else 0],295 'basement': [1 if basement else 0],296 'hotwaterheating': [1 if hotwaterheating else 0],297 'airconditioning': [1 if airconditioning else 0],298 'prefarea': [1 if prefarea else 0]299 })300 301 # Scale the numerical features302 input_df[num_vars] = scaler.transform(input_df[num_vars])303 304 # Add missing dummy variables with a value of 0305 for col in ['semi-furnished', 'unfurnished']:306 input_df[col] = 0307 308 # Reorder columns to match the training data309 input_df = input_df[X_train.columns]310 311 # Predict using the trained XGBoost model312 prediction = xg_reg.predict(input_df)313 314 return f"Predicted House Price: ${prediction[0]:,.2f}"315 316 except Exception as e:317 print(f"Error during prediction: {e}")318 return f"Error: {e}"319 320# Gradio interface321iface = gr.Interface(322 fn=predict_house_price,323 inputs=[324 gr.Number(label="Area"),325 gr.Number(label="Bedrooms"),326 gr.Number(label="Bathrooms"),327 gr.Number(label="Stories"),328 gr.Number(label="Parking"),329 gr.Checkbox(label="Mainroad"),330 gr.Checkbox(label="Guestroom"),331 gr.Checkbox(label="Basement"),332 gr.Checkbox(label="Hot Water Heating"),333 gr.Checkbox(label="Airconditioning"),334 gr.Checkbox(label="Preferred Area")335 ],336 outputs=gr.Textbox(label="Predicted House Price"),337 title="House Price Prediction",338 description="Input the house details to predict the price"339)340from gradio_client import Client, file341 342client = Client("imaniman/Housing")343 344client.predict(345 area=400,346 bedrooms=2,347 bathrooms=1,348 stories=1,349 parking=1,350 mainroad=False,351 guestroom=False,352 basement=False,353 hotwaterheating=False,354 airconditioning=False,355 prefarea=False,356 api_name="/predict"357)358iface.launch(share=True)