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()| 1 | 60 | RL | 65.0 | 8450 | Pave | NaN | Reg | Lvl | AllPub | ... | 0 | NaN | NaN | NaN | 0 | 2 | 2008 | WD | Normal | 208500 |
| 2 | 20 | RL | 80.0 | 9600 | Pave | NaN | Reg | Lvl | AllPub | ... | 0 | NaN | NaN | NaN | 0 | 5 | 2007 | WD | Normal | 181500 |
| 3 | 60 | RL | 68.0 | 11250 | Pave | NaN | IR1 | Lvl | AllPub | ... | 0 | NaN | NaN | NaN | 0 | 9 | 2008 | WD | Normal | 223500 |
| 4 | 70 | RL | 60.0 | 9550 | Pave | NaN | IR1 | Lvl | AllPub | ... | 0 | NaN | NaN | NaN | 0 | 2 | 2006 | WD | Abnorml | 140000 |
| 5 | 60 | RL | 84.0 | 14260 | Pave | NaN | IR1 | Lvl | AllPub | ... | 0 | NaN | NaN | NaN | 0 | 12 | 2008 | WD | Normal | 250000 |
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幾次,看看特性選擇有多穩定。
我們還可以直接看看最重要的系數是什么:
總結
以上是生活随笔為你收集整理的kaggle房价预测问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 趣分期上征信嘛
- 下一篇: 支付宝怎么查看自动续费业务