国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
一. EDA
1.1 輸入數據集
1.2 房價分布
1.3 與房價相關的特征
1.4 剔除離群樣本
二. 特征工程
2.1 校正特征類型
2.2 填充特征缺失值
2.3 偏度校正
2.4 特征刪除和新增
2.6 生成最終訓練數據
三. 模型訓練
3.1 單一模型
3.2 模型融合-stacking
3.3 模型融合-線性融合
首頁 后端開發(fā) Python教程 用Python做一個房價預測小工具!

用Python做一個房價預測小工具!

Apr 12, 2023 am 10:34 AM
python 工具 房價

用Python做一個房價預測小工具!

哈嘍,大家好。

這是一個房價預測的案例,來源于 Kaggle 網站,是很多算法初學者的第一道競賽題目。

該案例有著解機器學習問題的完整流程,包含EDA、特征工程、模型訓練、模型融合等。

用Python做一個房價預測小工具!

房價預測流程

下面跟著我,來學習一下該案例。

沒有啰嗦的文字,沒有多余的代碼,只有通俗的講解。

一. EDA

探索性數據分析(Exploratory Data Analysis,簡稱EDA) 的目的是讓我們對數據集有充分的了解。在這一步,我們探索的內容如下:

用Python做一個房價預測小工具!

EDA內容

1.1 輸入數據集

train = pd.read_csv('./data/train.csv')
test = pd.read_csv('./data/test.csv')

用Python做一個房價預測小工具!

訓練樣本

train和test分別是訓練集和測試集,分別有 1460 個樣本,80 個特征。

SalePrice列代表房價,是我們要預測的。

1.2 房價分布

因為我們任務是預測房價,所以在數據集中核心要關注的就是房價(SalePrice) 一列的取值分布。

sns.distplot(train['SalePrice']);

用Python做一個房價預測小工具!

房價取值分布

從圖上可以看出,SalePrice列峰值比較陡,并且峰值向左偏。

也可以直接調用skew()和kurt()函數計算SalePrice具體的偏度和峰度值。

對于偏度和峰度都比較大的情況,建議對SalePrice列取log()進行平滑。

1.3 與房價相關的特征

了解完SalePrice的分布后,我們可以計算 80 個特征與SalePrice的相關關系。

重點關注與SalePrice相關性最強的 10 個特征。

# 計算列之間相關性
corrmat = train.corr()
# 取 top10
k = 10
cols = corrmat.nlargest(k, 'SalePrice')['SalePrice'].index
# 繪圖
cm = np.corrcoef(train[cols].values.T)
sns.set(font_scale=1.25)
hm = sns.heatmap(cm, cbar=True, annot=True, square=True, fmt='.2f', annot_kws={'size': 10}, yticklabels=cols.values, xticklabels=cols.values)
plt.show()

用Python做一個房價預測小工具!

與SalePrice高度相關的特征

OverallQual(房子材料和裝飾)、GrLivArea(地上居住面積)、GarageCars(車庫容量)和 TotalBsmtSF(地下室面積)跟SalePrice有很強的相關性。

這些特征在后面做特征工程時也會重點關注。

1.4 剔除離群樣本

由于數據集樣本量很少,離群點不利于我們后面訓練模型。

所以需要計算每個數值特性的離群點,剔除掉離群次數最多的樣本。

# 獲取數值型特征
numeric_features = train.dtypes[train.dtypes != 'object'].index
# 計算每個特征的離群樣本
for feature in numeric_features:
outs = detect_outliers(train[feature], train['SalePrice'],top=5, plot=False)
all_outliers.extend(outs)
# 輸出離群次數最多的樣本
print(Counter(all_outliers).most_common())
# 剔除離群樣本
train = train.drop(train.index[outliers])

detect_outliers()是自定義函數,用sklearn庫的LocalOutlierFactor算法計算離群點。

到這里, EDA 就完成了。最后,將訓練集和測試集合并,進行下面的特征工程。

y = train.SalePrice.reset_index(drop=True)
train_features = train.drop(['SalePrice'], axis=1)
test_features = test
features = pd.concat([train_features, test_features]).reset_index(drop=True)

features合并了訓練集和測試集的特征,是我們下面要處理的數據。

二. 特征工程

用Python做一個房價預測小工具!

特征工程

2.1 校正特征類型

MSSubClass(房屋類型)、YrSold(銷售年份)和MoSold(銷售月份)是類別型特征,只不過用數字來表示,需要將它們轉成文本特征。

features['MSSubClass'] = features['MSSubClass'].apply(str)
features['YrSold'] = features['YrSold'].astype(str)
features['MoSold'] = features['MoSold'].astype(str)

2.2 填充特征缺失值

填充缺失值沒有統(tǒng)一的標準,需要根據不同的特征來決定按照什么樣的方式來填充。

# Functional:文檔提供了典型值 Typ
features['Functional'] = features['Functional'].fillna('Typ') #Typ 是典型值
# 分組填充需要按照相似的特征分組,取眾數或中位數
# MSZoning(房屋區(qū)域)按照 MSSubClass(房屋)類型分組填充眾數
features['MSZoning'] = features.groupby('MSSubClass')['MSZoning'].transform(lambda x: x.fillna(x.mode()[0]))
#LotFrontage(到接到舉例)按Neighborhood分組填充中位數
features['LotFrontage'] = features.groupby('Neighborhood')['LotFrontage'].transform(lambda x: x.fillna(x.median()))
# 車庫相關的數值型特征,空代表無,使用0填充空值。
for col in ('GarageYrBlt', 'GarageArea', 'GarageCars'):
features[col] = features[col].fillna(0)

2.3 偏度校正

跟探索SalePrice列類似,對偏度高的特征進行平滑。

# skew()方法,計算特征的偏度(skewness)。
skew_features = features[numeric_features].apply(lambda x: skew(x)).sort_values(ascending=False)
# 取偏度大于 0.15 的特征
high_skew = skew_features[skew_features > 0.15]
skew_index = high_skew.index
# 處理高偏度特征,將其轉化為正態(tài)分布,也可以使用簡單的log變換
for i in skew_index:
features[i] = boxcox1p(features[i], boxcox_normmax(features[i] + 1))

2.4 特征刪除和新增

對于幾乎都是缺失值,或單一取值占比高(99.94%)的特征可以直接刪除。

features = features.drop(['Utilities', 'Street', 'PoolQC',], axis=1)

同時,可以融合多個特征,生成新特征。

有時候模型很難學習到特征之間的關系,手動融合特征可以降低模型學習難度,提升效果。

# 將原施工日期和改造日期融合
features['YrBltAndRemod']=features['YearBuilt']+features['YearRemodAdd']
# 將地下室面積、1樓、2樓面積融合
features['TotalSF']=features['TotalBsmtSF'] + features['1stFlrSF'] + features['2ndFlrSF']

可以發(fā)現,我們融合的特征都是與SalePrice強相關的特征。

最后簡化特征,對分布單調的特征(如:100個數據中有99個的數值是0.9,另1個是0.1),進行01處理。

features['haspool'] = features['PoolArea'].apply(lambda x: 1 if x > 0 else 0)
features['has2ndfloor'] = features['2ndFlrSF'].apply(lambda x: 1 if x > 0 else 0)

2.6 生成最終訓練數據

到這里特征工程就做完了, 我們需要從features中將訓練集和測試集重新分離出來,構造最終的訓練數據。

X = features.iloc[:len(y), :]
X_sub = features.iloc[len(y):, :]
X = np.array(X.copy())
y = np.array(y)
X_sub = np.array(X_sub.copy())

三. 模型訓練

因為SalePrice是數值型且是連續(xù)的,所以需要訓練一個回歸模型。

3.1 單一模型

首先以嶺回歸(Ridge) 為例,構造一個k折交叉驗證模型。

from sklearn.linear_model import RidgeCV
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import KFold
kfolds = KFold(n_splits=10, shuffle=True, random_state=42)
alphas_alt = [14.5, 14.6, 14.7, 14.8, 14.9, 15, 15.1, 15.2, 15.3, 15.4, 15.5]
ridge = make_pipeline(RobustScaler(), RidgeCV(alphas=alphas_alt, cv=kfolds))

嶺回歸模型有一個超參數alpha,而RidgeCV的參數名是alphas,代表輸入一個超參數alpha數組。在擬合模型時,會從alpha數組中選擇表現較好某個取值。

由于現在只有一個模型,無法確定嶺回歸是不是最佳模型。所以我們可以找一些出場率高的模型多試試。

# lasso
lasso = make_pipeline(
RobustScaler(),
LassoCV(max_iter=1e7, alphas=alphas2, random_state=42, cv=kfolds))
#elastic net
elasticnet = make_pipeline(
RobustScaler(),
ElasticNetCV(max_iter=1e7, alphas=e_alphas, cv=kfolds, l1_ratio=e_l1ratio))
#svm
svr = make_pipeline(RobustScaler(), SVR(
C=20,
epsilon=0.008,
gamma=0.0003,
))
#GradientBoosting(展開到一階導數)
gbr = GradientBoostingRegressor(...)
#lightgbm
lightgbm = LGBMRegressor(...)
#xgboost(展開到二階導數)
xgboost = XGBRegressor(...)

有了多個模型,我們可以再定義一個得分函數,對模型評分。

#模型評分函數
def cv_rmse(model, X=X):
rmse = np.sqrt(-cross_val_score(model, X, y, scoring="neg_mean_squared_error", cv=kfolds))
return (rmse)

以嶺回歸為例,計算模型得分。

score = cv_rmse(ridge)
print("Ridge score: {:.4f} ({:.4f})n".format(score.mean(), score.std()), datetime.now(), ) #0.1024

運行其他模型發(fā)現得分都差不多。

這時候我們可以任選一個模型,擬合,預測,提交訓練結果。還是以嶺回歸為例

# 訓練模型
ridge.fit(X, y)
# 模型預測
submission.iloc[:,1] = np.floor(np.expm1(ridge.predict(X_sub)))
# 輸出測試結果
submission = pd.read_csv("./data/sample_submission.csv")
submission.to_csv("submission_single.csv", index=False)

submission_single.csv是嶺回歸預測的房價,我們可以把這個結果上傳到 Kaggle 網站查看結果的得分和排名。

3.2 模型融合-stacking

有時候為了發(fā)揮多個模型的作用,我們會將多個模型融合,這種方式又被稱為集成學習。

stacking 是一種常見的集成學習方法。簡單來說,它會定義個元模型,其他模型的輸出作為元模型的輸入特征,元模型的輸出將作為最終的預測結果。

用Python做一個房價預測小工具!

stacking

這里,我們用mlextend庫中的StackingCVRegressor模塊,對模型做stacking。

stack_gen =
StackingCVRegressor(
regressors=(ridge, lasso, elasticnet, gbr, xgboost, lightgbm),
meta_regressor=xgboost,
use_features_in_secondary=True)

訓練、預測的過程與上面一樣,這里不再贅述。

3.3 模型融合-線性融合

多模型線性融合的思想很簡單,給每個模型分配一個權重(權重加和=1),最終的預測結果取各模型的加權平均值。

# 訓練單個模型
ridge_model_full_data = ridge.fit(X, y)
lasso_model_full_data = lasso.fit(X, y)
elastic_model_full_data = elasticnet.fit(X, y)
gbr_model_full_data = gbr.fit(X, y)
xgb_model_full_data = xgboost.fit(X, y)
lgb_model_full_data = lightgbm.fit(X, y)
svr_model_full_data = svr.fit(X, y)
models = [
ridge_model_full_data, lasso_model_full_data, elastic_model_full_data,
gbr_model_full_data, xgb_model_full_data, lgb_model_full_data,
svr_model_full_data, stack_gen_model
]
# 分配模型權重
public_coefs = [0.1, 0.1, 0.1, 0.1, 0.15, 0.1, 0.1, 0.25]
# 線性融合,取加權平均
def linear_blend_models_predict(data_x,models,coefs, bias):
tmp=[model.predict(data_x) for model in models]
tmp = [c*d for c,d in zip(coefs,tmp)]
pres=np.array(tmp).swapaxes(0,1)
pres=np.sum(pres,axis=1)
return pres

到這里,房價預測的案例我們就講解完了,大家可以自己運行一下,看看不同方式訓練出來的模型效果。

回顧整個案例會發(fā)現,我們在數據預處理和特征工程上花費了很大心思,雖然機器學習問題模型原理比較難學,但實際過程中往往特征工程花費的心思最多。

以上是用Python做一個房價預測小工具!的詳細內容。更多信息請關注PHP中文網其他相關文章!

本站聲明
本文內容由網友自發(fā)貢獻,版權歸原作者所有,本站不承擔相應法律責任。如您發(fā)現有涉嫌抄襲侵權的內容,請聯系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅動的應用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

熱門話題

Laravel 教程
1600
29
PHP教程
1502
276
如何下載幣安官方app 幣安交易所app下載鏈接獲取 如何下載幣安官方app 幣安交易所app下載鏈接獲取 Aug 04, 2025 pm 11:21 PM

幣安(Binance)作為國際領先的區(qū)塊鏈數字資產交易平臺,為用戶提供了安全、便捷的交易體驗。其官方App集成了行情查看、資產管理、幣幣交易及法幣交易等多種核心功能。

歐易交易所APP安卓版 v6.132.0 歐易APP官網下載安裝指南2025 歐易交易所APP安卓版 v6.132.0 歐易APP官網下載安裝指南2025 Aug 04, 2025 pm 11:18 PM

歐易(OKX)是一款全球知名的數字資產綜合服務平臺,為廣大用戶提供涵蓋現貨、合約、期權等在內的多元化產品和服務。其官方APP憑借流暢的操作體驗和強大的功能集成,成為了許多數字資產用戶的常用工具。

幣安官方app下載最新鏈接 幣安交易所app安裝入口 幣安官方app下載最新鏈接 幣安交易所app安裝入口 Aug 04, 2025 pm 11:24 PM

幣安(Binance)是全球知名的數字資產交易平臺,為用戶提供安全、穩(wěn)定且豐富的加密貨幣交易服務。其App設計簡潔,功能強大,支持多種交易類型和資產管理工具。

如何在Python中創(chuàng)建虛擬環(huán)境 如何在Python中創(chuàng)建虛擬環(huán)境 Aug 05, 2025 pm 01:05 PM

創(chuàng)建Python虛擬環(huán)境可使用venv模塊,步驟為:1.進入項目目錄執(zhí)行python-mvenvenv創(chuàng)建環(huán)境;2.Mac/Linux用sourceenv/bin/activate、Windows用env\Scripts\activate激活;3.使用pipinstall安裝包、pipfreeze>requirements.txt導出依賴;4.注意避免將虛擬環(huán)境提交到Git,并確認安裝時處于正確環(huán)境。虛擬環(huán)境能隔離項目依賴防止沖突,尤其適合多項目開發(fā),編輯器如PyCharm或VSCode也

幣安官方app最新官網入口 幣安交易所app下載地址 幣安官方app最新官網入口 幣安交易所app下載地址 Aug 04, 2025 pm 11:27 PM

幣安(Binance)是全球知名的數字資產交易平臺之一,為廣大用戶提供安全、穩(wěn)定、便捷的加密貨幣交易服務。通過幣安App,您可以隨時隨地進行市場行情查看、買賣交易及資產管理。

如何在崇高文本中運行Python代碼 如何在崇高文本中運行Python代碼 Aug 04, 2025 pm 04:25 PM

EnsurePythonisinstalledandaddedtoPATHbycheckingversioninterminal;2.Savefilewith.pyextension;3.UseCtrl Btorunviadefaultbuildsystem;4.CreateacustombuildsystemifneededbygoingtoTools>BuildSystem>NewBuildSystem,enteringthecorrectcmdforyourPythonvers

在Python中調試內存泄漏的常見策略是什么? 在Python中調試內存泄漏的常見策略是什么? Aug 06, 2025 pm 01:43 PM

Usetracemalloctotrackmemoryallocationsandidentifyhigh-memorylines;2.Monitorobjectcountswithgcandobjgraphtodetectgrowingobjecttypes;3.Inspectreferencecyclesandlong-livedreferencesusingobjgraph.show_backrefsandcheckforuncollectedcycles;4.Usememory_prof

什么是拋物線SAR指標?SAR指標的工作原理?SAR指標全面介紹 什么是拋物線SAR指標?SAR指標的工作原理?SAR指標全面介紹 Aug 06, 2025 pm 08:12 PM

目錄理解拋物線SAR的機制拋物線SAR的工作原理計算方法和加速因子交易圖表上的視覺表現在加密貨幣市場中應用拋物線SAR1.識別潛在的趨勢反轉2.確定最佳進場和出場點3.設置動態(tài)止損訂單案例研究:假設的ETH交易場景拋物線SAR交易信號及解讀基于拋物線SAR的假設交易執(zhí)行將拋物線SAR與其他指標結合1.使用移動平均線確認趨勢2.相對強弱指標(RSI)用于動量分析3.布林帶用于波動性分析拋物線SAR的優(yōu)勢和局限性拋物線SAR的優(yōu)勢

See all articles