日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

kaggle房价预测问题

發布時間:2024/10/8 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 kaggle房价预测问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參考:https://blog.csdn.net/m0_37870649/article/details/80979783
sklean的線性模型完成kaggle房價預測問題

https://www.kaggle.com/c/house-prices-Advanced-regression-techniques

賽題給我們79個描述房屋的特征,要求我們據此預測房屋的最終售價,即對于測試集中每個房屋的ID給出對于的SalePrice字段的預測值,主要考察我們數據清洗、特征工程、模型搭建及調優等方面的技巧。本賽題是典型的回歸類問題,評估指標選用的是均方根誤差(RMSE),為了使得價格的高低對結果的評估有均等的影響,賽題均方根誤差基于預測值和實際值分別取對數對數來計算。 特征初步分析: 1. SalePrice 房屋售價,我們要預測的label,類型:數值型,單位:美元 2. MSSubClass: 建筑的等級,類型:類別型 MSZoning: 區域分類,類型:類別型 LotFrontage: 距離街道的直線距離,類型:數值型,單位:英尺 LotArea: 地皮面積,類型:數值型,單位:平方英尺 Street: 街道類型,類型:類別型 Alley: 巷子類型,類型:類別型 LotShape: 房子整體形狀,類型:類別型 LandContour: 平整度級別,類型:類別型 Utilities: 公共設施類型,類型:類別型 LotConfig: 房屋配置,類型:類別型 LandSlope: 傾斜度,類型:類別型 Neighborhood: 市區物理位置,類型:類別型 Condition1: 主干道或者鐵路便利程度,類型:類別型 Condition2: 主干道或者鐵路便利程度,類型:類別型 BldgType: 住宅類型,類型:類別型 HouseStyle: 住宅風格,類型:類別型 OverallQual: 整體材料和飾面質量,類型:數值型 OverallCond: 總體狀況評價,類型:數值型 YearBuilt: 建筑年份,類型:數值型 YearRemodAdd: 改建年份,類型:數值型 RoofStyle: 屋頂類型,類型:類別型 RoofMatl: 屋頂材料,類型:類別型 Exterior1st: 住宅外墻,類型:類別型 Exterior2nd: 住宅外墻,類型:類別型 MasVnrType: 砌體飾面類型,類型:類別型 MasVnrArea: 砌體飾面面積,類型:數值型,單位:平方英尺 ExterQual: 外部材料質量,類型:類別型 ExterCond: 外部材料的現狀,類型:類別型 Foundation: 地基類型,類型:類別型 BsmtQual: 地下室高度,類型:類別型 BsmtCond: 地下室概況,類型:類別型 BsmtExposure: 花園地下室墻,類型:類別型 BsmtFinType1: 地下室裝飾質量,類型:類別型 BsmtFinSF1: 地下室裝飾面積,類型:類別型 BsmtFinType2: 地下室裝飾質量,類型:類別型 BsmtFinSF2: 地下室裝飾面積,類型:類別型 BsmtUnfSF: 未裝飾的地下室面積,類型:數值型,單位:平方英尺 TotalBsmtSF: 地下室總面積,類型:數值型,單位:平方英尺 Heating: 供暖類型,類型:類別型 HeatingQC: 供暖質量和條件,類型:類別型 CentralAir: 中央空調狀況,類型:類別型 Electrical: 電力系統,類型:類別型 1stFlrSF: 首層面積,類型:數值型,單位:平方英尺 2ndFlrSF: 二層面積,類型:數值型,單位:平方英尺 LowQualFinSF: 低質裝飾面積,類型:數值型,單位:平方英尺 GrLivArea: 地面以上居住面積,類型:數值型,單位:平方英尺 BsmtFullBath: 地下室全浴室,類型:數值 BsmtHalfBath: 地下室半浴室,類型:數值 FullBath: 高檔全浴室,類型:數值 HalfBath: 高檔半浴室,類型:數值 BedroomAbvGr: 地下室以上的臥室數量,類型:數值 KitchenAbvGr: 廚房數量,類型:數值 KitchenQual: 廚房質量,類型:類別型 TotRmsAbvGrd: 地上除臥室以外的房間數,類型:數值 Functional: 房屋功用性評級,類型:類別型 Fireplaces: 壁爐數量,類型:數值 FireplaceQu: 壁爐質量,類型:類別型 GarageType: 車庫位置,類型:類別型 GarageYrBlt: 車庫建造年份,類別:數值型 GarageFinish: 車庫內飾,類型:類別型 GarageCars: 車庫車容量大小,類別:數值型 GarageArea: 車庫面積,類別:數值型,單位:平方英尺 GarageQual: 車庫質量,類型:類別型 GarageCond: 車庫條件,類型:類別型 PavedDrive: 鋪的車道情況,類型:類別型 WoodDeckSF: 木地板面積,類型:數值型,單位:平方英尺 OpenPorchSF: 開放式門廊區面積,類型:數值型,單位:平方英尺 EnclosedPorch: 封閉式門廊區面積,類型:數值型,單位:平方英尺 3SsnPorch: 三個季節門廊面積,類型:數值型,單位:平方英尺 ScreenPorch: 紗門門廊面積,類型:數值型,單位:平方英尺 PoolArea: 泳池面積,類型:數值型,單位:平方英尺 PoolQC:泳池質量,類型:類別型 Fence: 圍墻質量,類型:類別型 MiscFeature: 其他特征,類型:類別型 MiscVal: 其他雜項特征值,類型:類別型 MoSold: 賣出月份,類別:數值型 YrSold: 賣出年份,類別:數值型 SaleType: 交易類型,類型:類別型 SaleCondition: 交易條件,類型:類別型

import pandas as pd import numpy as np import seaborn as sns import matplotlibimport matplotlib.pyplot as plt from scipy.stats import skew from scipy.stats.stats import pearsonr%config InlineBackend.figure_format = 'retina' #set 'png' here when working on notebook %matplotlib inline train = pd.read_csv("train.csv") test = pd.read_csv("test.csv") train.head() IdMSSubClassMSZoningLotFrontageLotAreaStreetAlleyLotShapeLandContourUtilities...PoolAreaPoolQCFenceMiscFeatureMiscValMoSoldYrSoldSaleTypeSaleConditionSalePrice01234
160RL65.08450PaveNaNRegLvlAllPub...0NaNNaNNaN022008WDNormal208500
220RL80.09600PaveNaNRegLvlAllPub...0NaNNaNNaN052007WDNormal181500
360RL68.011250PaveNaNIR1LvlAllPub...0NaNNaNNaN092008WDNormal223500
470RL60.09550PaveNaNIR1LvlAllPub...0NaNNaNNaN022006WDAbnorml140000
560RL84.014260PaveNaNIR1LvlAllPub...0NaNNaNNaN0122008WDNormal250000

5 rows × 81 columns

all_data = pd.concat((train.loc[:,'MSSubClass':'SaleCondition'],test.loc[:,'MSSubClass':'SaleCondition']))

數據預處理:

我們不會在這里做任何花哨的事情:

首先,我將通過記錄(feature+1)來轉換傾斜的數字特性-這將使特性更加正常

為分類特征創建虛擬變量

將數字缺失值(NaN)替換為其各自列的平均值

matplotlib.rcParams['figure.figsize'] = (12.0, 6.0) prices = pd.DataFrame({"price":train["SalePrice"], "log(price + 1)":np.log1p(train["SalePrice"])}) prices.hist() array([[<matplotlib.axes._subplots.AxesSubplot object at 0x00000268013A1320>,<matplotlib.axes._subplots.AxesSubplot object at 0x00000268013F20F0>]],dtype=object)

#log transform the target: train["SalePrice"] = np.log1p(train["SalePrice"])#log transform skewed numeric features: numeric_feats = all_data.dtypes[all_data.dtypes != "object"].indexskewed_feats = train[numeric_feats].apply(lambda x: skew(x.dropna())) #compute skewness skewed_feats = skewed_feats[skewed_feats > 0.75] skewed_feats = skewed_feats.indexall_data[skewed_feats] = np.log1p(all_data[skewed_feats]) all_data = pd.get_dummies(all_data) #用列的平均值填充na's: all_data = all_data.fillna(all_data.mean()) #為sklearn創建矩陣: X_train = all_data[:train.shape[0]] X_test = all_data[train.shape[0]:] y = train.SalePrice

模型

現在我們將使用SciKit學習模塊中的正則化線性回歸模型。我將嘗試l_1(套索)和l_2(嶺)的正規化。我還將定義一個返回交叉驗證RMSE錯誤的函數,這樣我們就可以評估模型并選擇最佳的調優參數。

from sklearn.linear_model import Ridge, RidgeCV, ElasticNet, LassoCV, LassoLarsCV from sklearn.model_selection import cross_val_scoredef rmse_cv(model):rmse= np.sqrt(-cross_val_score(model, X_train, y, scoring="neg_mean_squared_error", cv = 5))return(rmse) model_ridge = Ridge()

嶺模型的主要調整參數是alpha——一個測量模型靈活性的正則化參數。正則化程度越高,模型越不容易過度擬合。但是,它也會失去靈活性,可能無法捕獲數據中的所有信號。

alphas = [0.05, 0.1, 0.3, 1, 3, 5, 10, 15, 30, 50, 75] cv_ridge = [rmse_cv(Ridge(alpha = alpha)).mean() for alpha in alphas] cv_ridge = pd.Series(cv_ridge, index = alphas) cv_ridge.plot(title = "Validation - Just Do It") plt.xlabel("alpha") plt.ylabel("rmse") Text(0,0.5,'rmse')

注意上面的U形曲線。當alpha太大時,正則化太強,模型無法捕獲數據中的所有復雜性。然而,如果我們讓模型過于靈活(alpha小),模型就會開始過度擬合。根據上面的圖,alpha=10的值大約是右的。

cv_ridge.min() 0.1273373466867077

所以對于嶺回歸,我們得到了大約0.127的rmsle。

讓我們試試套索模型。我們將在這里做一個稍微不同的方法,并使用內置的lasso cv為我們找出最好的alpha。出于某種原因,拉索cv中的alphas實際上是反向的,或者脊中的alphas。

model_lasso = LassoCV(alphas = [1, 0.1, 0.001, 0.0005]).fit(X_train, y) rmse_cv(model_lasso).mean() 0.12314421090977452

好極了!套索的性能更好,所以我們只需要用這個來預測測試集。關于套索的另一個好處是它為你做了特征選擇——設置了它認為不重要的特征系數為零。讓我們來看看系數:

coef = pd.Series(model_lasso.coef_, index = X_train.columns) print("Lasso picked " + str(sum(coef != 0)) + " variables and eliminated the other " + str(sum(coef == 0)) + " variables") Lasso picked 110 variables and eliminated the other 178 variables

做得好套索。然而,這里需要注意的一點是,所選的特性不一定是“正確的”特性,特別是因為在這個數據集中有很多共線特性。在這里嘗試的一個想法是在增強的樣本上運行lasso幾次,看看特性選擇有多穩定。
我們還可以直接看看最重要的系數是什么:

imp_coef = pd.concat([coef.sort_values().head(10),coef.sort_values().tail(10)]) matplotlib.rcParams['figure.figsize'] = (8.0, 10.0) imp_coef.plot(kind = "barh") plt.title("Coefficients in the Lasso Model") Text(0.5,1,'Coefficients in the Lasso Model')

#let's look at the residuals as well: matplotlib.rcParams['figure.figsize'] = (6.0, 6.0)preds = pd.DataFrame({"preds":model_lasso.predict(X_train), "true":y}) preds["residuals"] = preds["true"] - preds["preds"] preds.plot(x = "preds", y = "residuals",kind = "scatter") <matplotlib.axes._subplots.AxesSubplot at 0x26801c06780>

總結

以上是生活随笔為你收集整理的kaggle房价预测问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。