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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

房价预测(基于决策树算法)

發(fā)布時間:2023/12/8 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 房价预测(基于决策树算法) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

預測波士頓房價


第一步. 導入數(shù)據(jù)

在這個項目中,將使用波士頓房屋信息數(shù)據(jù)來訓練和測試一個模型,并對模型的性能和預測能力進行評估。我們希望可以通過該模型實現(xiàn)對房屋的價值預估,提高房地產(chǎn)經(jīng)紀人的工作效率。

此項目的數(shù)據(jù)集來自kaggle原始數(shù)據(jù),未經(jīng)過任何處理。該數(shù)據(jù)集統(tǒng)計了2006年至2010年波士頓個人住宅銷售情況,包含2900多條觀測數(shù)據(jù)(其中一半是訓練數(shù)據(jù),即我們的housedata.csv文件)。更多文檔信息可以參考作者的文檔,以及項目附件data_description.txt文件(特征描述文件)。

下面區(qū)域的代碼用以載入一些此項目所需的Python庫。

# 載入此項目需要的庫 import numpy as np import pandas as pd import visuals as vs # Supplementary code 補充的可視化代碼import matplotlib.pyplot as plt import seaborn as sns plt.style.use('seaborn') # use seaborn style 使用seaborn風格import warnings warnings.filterwarnings('ignore')%matplotlib inline print('你已經(jīng)成功載入所有庫!') 你已經(jīng)成功載入所有庫!

加載數(shù)據(jù)

# 載入波士頓房屋的數(shù)據(jù)集:使用pandas載入csv,并賦值到data_df data_df = pd.read_csv('housedata.csv')# 成功載入的話輸出訓練數(shù)據(jù)行列數(shù)目 print("Boston housing dataset has {} data points with {} variables each.".format(*data_df.shape)) Boston housing dataset has 1460 data points with 81 variables each.

第二步. 數(shù)據(jù)分析

這個部分,將對已有的波士頓房地產(chǎn)數(shù)據(jù)進行初步的觀察與處理。

由于這個項目的最終目標是建立一個預測房屋價值的模型,需要將數(shù)據(jù)集分為特征(features)目標變量(target variable)

  • 目標變量:'SalePrice',是我們希望預測的變量。
  • 特征:除'SalePrice'外的屬性都是特征,它們反應了數(shù)據(jù)點在某些方面的表現(xiàn)或性質。

觀察數(shù)據(jù)

對波士頓房價的數(shù)據(jù)進行觀察,從而掌握更多數(shù)據(jù)本身的信息。

(1)使用 head方法 打印并觀察前7條data_df數(shù)據(jù)

# 打印出前7條data_df print(data_df.head(7)) Id MSSubClass MSZoning LotFrontage LotArea Street Alley LotShape \ 0 1 60 RL 65.0 8450 Pave NaN Reg 1 2 20 RL 80.0 9600 Pave NaN Reg 2 3 60 RL 68.0 11250 Pave NaN IR1 3 4 70 RL 60.0 9550 Pave NaN IR1 4 5 60 RL 84.0 14260 Pave NaN IR1 5 6 50 RL 85.0 14115 Pave NaN IR1 6 7 20 RL 75.0 10084 Pave NaN Reg LandContour Utilities ... PoolArea PoolQC Fence MiscFeature MiscVal \ 0 Lvl AllPub ... 0 NaN NaN NaN 0 1 Lvl AllPub ... 0 NaN NaN NaN 0 2 Lvl AllPub ... 0 NaN NaN NaN 0 3 Lvl AllPub ... 0 NaN NaN NaN 0 4 Lvl AllPub ... 0 NaN NaN NaN 0 5 Lvl AllPub ... 0 NaN MnPrv Shed 700 6 Lvl AllPub ... 0 NaN NaN NaN 0 MoSold YrSold SaleType SaleCondition SalePrice 0 2 2008 WD Normal 208500 1 5 2007 WD Normal 181500 2 9 2008 WD Normal 223500 3 2 2006 WD Abnorml 140000 4 12 2008 WD Normal 250000 5 10 2009 WD Normal 143000 6 8 2007 WD Normal 307000 [7 rows x 81 columns]

(2)Id特征對我們訓練數(shù)據(jù)沒有任何用處,在data_df中使用drop方法刪除'Id'列數(shù)據(jù)

# 刪除data_df中的Id特征(保持數(shù)據(jù)仍在data_df中,不更改變量名) data_df.drop('Id',axis=1,inplace=True)

(3)使用describe方法觀察data_df各個特征的統(tǒng)計信息:

data_df.describe() MSSubClassLotFrontageLotAreaOverallQualOverallCondYearBuiltYearRemodAddMasVnrAreaBsmtFinSF1BsmtFinSF2...WoodDeckSFOpenPorchSFEnclosedPorch3SsnPorchScreenPorchPoolAreaMiscValMoSoldYrSoldSalePricecountmeanstdmin25%50%75%max
1460.0000001201.0000001460.0000001460.0000001460.0000001460.0000001460.0000001452.0000001460.0000001460.000000...1460.0000001460.0000001460.0000001460.0000001460.0000001460.0000001460.0000001460.0000001460.0000001460.000000
56.89726070.04995810516.8280826.0993155.5753421971.2678081984.865753103.685262443.63972646.549315...94.24452146.66027421.9541103.40958915.0609592.75890443.4890416.3219182007.815753180921.195890
42.30057124.2847529981.2649321.3829971.11279930.20290420.645407181.066207456.098091161.319273...125.33879466.25602861.11914929.31733155.75741540.177307496.1230242.7036261.32809579442.502883
20.00000021.0000001300.0000001.0000001.0000001872.0000001950.0000000.0000000.0000000.000000...0.0000000.0000000.0000000.0000000.0000000.0000000.0000001.0000002006.00000034900.000000
20.00000059.0000007553.5000005.0000005.0000001954.0000001967.0000000.0000000.0000000.000000...0.0000000.0000000.0000000.0000000.0000000.0000000.0000005.0000002007.000000129975.000000
50.00000069.0000009478.5000006.0000005.0000001973.0000001994.0000000.000000383.5000000.000000...0.00000025.0000000.0000000.0000000.0000000.0000000.0000006.0000002008.000000163000.000000
70.00000080.00000011601.5000007.0000006.0000002000.0000002004.000000166.000000712.2500000.000000...168.00000068.0000000.0000000.0000000.0000000.0000000.0000008.0000002009.000000214000.000000
190.000000313.000000215245.00000010.0000009.0000002010.0000002010.0000001600.0000005644.0000001474.000000...857.000000547.000000552.000000508.000000480.000000738.00000015500.00000012.0000002010.000000755000.000000

8 rows × 37 columns


數(shù)據(jù)預處理

數(shù)據(jù)不可能是百分百的‘干凈’數(shù)據(jù)(即有用數(shù)據(jù)),總會在采集整理時有些”失誤“、“冗余”,造成“臟”數(shù)據(jù),所以要從數(shù)據(jù)的正確性和完整性這兩個方面來清理數(shù)據(jù)。

  • 正確性:一般是指有沒有異常值,比如我們這個數(shù)據(jù)集中作者的文檔所說:
    I would recommend removing any houses with more than 4000 square feet from the data set (which eliminates these five unusual observations) before assigning it to students.
    建議我們?nèi)サ魯?shù)據(jù)中'GrLivArea'中超過4000平方英尺的房屋(具體原因可以參考文檔),當然本數(shù)據(jù)集還有其他的異常點,這里不再處理。
  • 完整性:采集或者整理數(shù)據(jù)時所產(chǎn)生的空數(shù)據(jù)造成了數(shù)據(jù)的完整性缺失,通常我們會使用一定的方法處理不完整的數(shù)據(jù)。在本例中,我們使用以下兩種方法,一是丟棄數(shù)據(jù),即選擇丟棄過多空數(shù)據(jù)的特征(或者直接丟棄數(shù)據(jù)行,前提是NA數(shù)據(jù)占比不多),二是填補數(shù)據(jù),填補的方法也很多,均值中位數(shù)眾數(shù)填充等等都是好方法。

正確性方面

以下代碼將使用matplotlib庫中的scatter方法 繪制'GrLivArea'和'SalePrice'的散點圖,x軸為'GrLivArea',y軸為'SalePrice',觀察數(shù)據(jù)**

# 繪制散點圖 plt.scatter(data_df['GrLivArea'],data_df['SalePrice']) plt.xlabel('GrLivArea') plt.ylabel('SalePrice') plt.show()

**觀察所得:通過上圖我們可以看到那幾個異常值,即'GrLivArea'大于4000,但是'SalePrice'又極低的數(shù)據(jù),所以需要從data_df刪除這幾個異常值。

刪除后重新繪制'GrLivArea'和'SalePrice'的關系圖,確認異常值已刪除。**

# 從data_df中刪除 GrLivArea大于4000 且 SalePrice低于300000 的值 index_del = data_df[(data_df['GrLivArea'] > 4000) & (data_df['SalePrice'] < 300000)].index data_df.drop(index=index_del, inplace=True)# 重新繪制GrLivArea和SalePrice的關系圖,確認異常值已刪除 plt.scatter(data_df['GrLivArea'],data_df['SalePrice']) plt.xlabel('GrLivArea') plt.ylabel('SalePrice') plt.show()


完整性方面

篩選出過多空數(shù)據(jù)的特征,這個項目定為篩選出有超過25%為空數(shù)據(jù)的特征

limit_percent = 0.25 limit_value = len(data_df) * limit_percent # 統(tǒng)計并打印出超過25%的空數(shù)據(jù)的特征 list(data_df.columns[data_df.isna().sum() > limit_value]) ['Alley', 'FireplaceQu', 'PoolQC', 'Fence', 'MiscFeature']

接著,查看data_description.txt文件,就會發(fā)現(xiàn),這些并非一定是空缺數(shù)據(jù),而沒有游泳池,籬笆等也會用NA來表示,那么就不需要刪除這些特征了,而是用None來填充NA數(shù)據(jù)。

以下將使用fillna方法填充空數(shù)據(jù)。

# 確定所有空特征 missing_columns = list(data_df.columns[data_df.isnull().sum() != 0]) # 確定哪些是類別特征,哪些是數(shù)值特征 missing_numerical = list(data_df[missing_columns].dtypes[data_df[missing_columns].dtypes != 'object'].index) missing_category = [i for i in missing_columns if i not in missing_numerical] print("missing_numerical:",missing_numerical) print("missing_category:",missing_category) missing_numerical: ['LotFrontage', 'MasVnrArea', 'GarageYrBlt'] missing_category: ['Alley', 'MasVnrType', 'BsmtQual', 'BsmtCond', 'BsmtExposure', 'BsmtFinType1', 'BsmtFinType2', 'Electrical', 'FireplaceQu', 'GarageType', 'GarageFinish', 'GarageQual', 'GarageCond', 'PoolQC', 'Fence', 'MiscFeature'] # 需要填充眾數(shù)的特征 fill_Mode = ['Electrical'] # 需要填充None的特征 fill_None = ['Alley', 'MasVnrType', 'BsmtQual', 'BsmtCond', 'BsmtExposure', 'BsmtFinType1', 'BsmtFinType2', 'FireplaceQu', 'GarageType', 'GarageFinish', 'GarageQual', 'GarageCond', 'PoolQC', 'Fence', 'MiscFeature'] # 需要填充0的特征 fill_0 = ['GarageYrBlt'] # 需要填充中位數(shù)的特征 fill_median = ['LotFrontage', 'MasVnrArea']# 按需填補上面數(shù)據(jù) data_df[fill_Mode] = data_df[fill_Mode].fillna(data_df[fill_Mode].mode()) data_df[fill_None] = data_df[fill_None].fillna('None') data_df[fill_0] = data_df[fill_0].fillna(0) data_df[fill_median] = data_df[fill_median].fillna(data_df[fill_median].mean())

特征分析

有這么一句話在業(yè)界廣泛流傳:特征數(shù)據(jù)決定了機器學習的上限,而模型和算法只是逼近這個上限而已。特征工程,是整個數(shù)據(jù)分析過程中不可缺少的一個環(huán)節(jié),其結果質量直接關系到模型效果和最終結論。從上面兩步中我們得到了“干凈”的數(shù)據(jù),但是data_df總共有81個特征,應當剔除那些無關緊要的特征(噪聲),使用真正關鍵的特征來進行模型訓練。現(xiàn)在需要我們對這些龐大的數(shù)據(jù)進行分析,提取出與目標最為關聯(lián)的數(shù)據(jù)。

繪制'SalePrice'的直方圖,觀察該直方圖屬于什么分布

# 繪制直方圖 plt.hist(data_df['SalePrice']) plt.xlabel('SalePrice') plt.show()

觀察結論:'SalePrice'屬于正偏態(tài)分布。


如果特征極其多,很難清晰的看到特征與目標變量之間的關系,就需要利用統(tǒng)計知識來進行多變量分析了。常用的方法可使用熱圖heatmap結合corr方法來進行客觀分析,熱圖Heatmap可以用顏色變化來反映變量之間的相關性二維矩陣或說相關性表格中的數(shù)據(jù)信息,它可以直觀地將數(shù)據(jù)值的大小以定義的顏色深淺表示出來。

這個項目,為了簡化訓練,將以相關性絕對值大于0.5為界來選取所需要的特征。

corrmat = data_df.corr().abs() top_corr = corrmat[corrmat["SalePrice"]>0.5].sort_values(by = ["SalePrice"], ascending = False).index cm = abs(np.corrcoef(data_df[top_corr].values.T)) f, ax = plt.subplots(figsize=(20, 9)) sns.set(font_scale=1.3) hm = sns.heatmap(cm, cbar=True, annot=True,square=True, fmt='.2f', annot_kws={'size': 13}, yticklabels=top_corr.values, xticklabels=top_corr.values); data_df = data_df[top_corr]


接下來,我們從創(chuàng)造性方面來對我們的特征進行“改造”。

  • 創(chuàng)造性:創(chuàng)造性主要是說兩種情況,一種是對現(xiàn)有數(shù)據(jù)的處理,比如對類別的獨熱編碼(One-hotEncoder)或者標簽編碼(LabelEncoder),數(shù)值的區(qū)間縮放,歸一化,標準化等等。另一種就是根據(jù)某一個或多個特征創(chuàng)造一個新的特征,例如某特征按組分類(groupby)后,或者某些特征組合后來創(chuàng)造新特征等等。

因為篩選出來的特征都為數(shù)值類型特征,所以只做標準化的操作:這個項目是一個回歸類型的項目,而回歸算法對標準正態(tài)分步預測較為準確,從目標數(shù)據(jù)可以看出數(shù)據(jù)是一個偏態(tài)分布,那么將使用log將數(shù)據(jù)從偏態(tài)分布轉換為標準正態(tài)分布,最后進行標準化。

from scipy.special import boxcox1p from sklearn.preprocessing import StandardScalerdata_df['SalePrice'] = np.log1p(data_df['SalePrice']) numeric_features = list(data_df.columns) numeric_features.remove('SalePrice') for feature in numeric_features:#all_data[feat] += 1data_df[feature] = boxcox1p(data_df[feature], 0.15)scaler = StandardScaler() scaler.fit(data_df[numeric_features]) data_df[numeric_features] = scaler.transform(data_df[numeric_features])

第三步. 建立模型

定義衡量標準

如果不能對模型的訓練和測試的表現(xiàn)進行量化地評估,就很難衡量模型的好壞。通常需要定義一些衡量標準,這些標準可以通過對某些誤差或者擬合程度的計算來得到。在這個項目中,將通過運算決定系數(shù) R2R^2R2 來量化模型的表現(xiàn)。模型的決定系數(shù)是回歸分析中十分常用的統(tǒng)計信息,經(jīng)常被當作衡量模型預測能力好壞的標準。

R2R^2R2 的數(shù)值范圍從0至1,表示目標變量的預測值和實際值之間的相關程度平方的百分比。一個模型的 R2R^2R2 值為0還不如直接用平均值來預測效果好;而一個 R2R^2R2 值為1的模型則可以對目標變量進行完美的預測。從0至1之間的數(shù)值,則表示該模型中目標變量中有百分之多少能夠用特征來解釋。模型也可能出現(xiàn)負值的 R2R^2R2,這種情況下模型所做預測有時會比直接計算目標變量的平均值差很多。


在下方代碼的 performance_metric 函數(shù)中,將實現(xiàn):

  • 使用 sklearn.metrics 中的 r2_score 來計算 y_true 和 y_predict 的 R2R^2R2 值,作為對其表現(xiàn)的評判。
  • 將他們的表現(xiàn)評分儲存到 score 變量中。
# 引入 'r2_score' from sklearn.metrics import r2_scoredef performance_metric(y_true, y_predict):""" Calculates and returns the performance score between true and predicted values based on the metric chosen. """# 計算 'y_true' 與 'y_predict' 的r2值score = r2_score(y_true, y_predict) # 返回這一分數(shù)return score

擬合程度

假設一個數(shù)據(jù)集有五個數(shù)據(jù)且某一模型做出下列目標變量的預測:

真實數(shù)值預測數(shù)值
3.02.5
-0.50.0
2.02.1
7.07.8
4.25.3

提示R2R^2R2 分數(shù)是指可以從自變量中預測的因變量的方差比例。 換一種說法:

  • R2R^2R2 為0意味著因變量不能從自變量預測。
  • R2R^2R2 為1意味著可以從自變量預測因變量。
  • R2R^2R2 在0到1之間表示因變量可預測的程度。
  • R2R^2R2 為0.40意味著 Y 中40%的方差可以從 X 預測。

下方的代碼將使用 performance_metric 函數(shù)來計算 y_true 和 y_predict 的決定系數(shù)。

# 計算這一模型的表現(xiàn) score = performance_metric([3, -0.5, 2, 7, 4.2], [2.5, 0.0, 2.1, 7.8, 5.3]) print("Model has a coefficient of determination, R^2, of {:.3f}.".format(score)) Model has a coefficient of determination, R^2, of 0.923.

結論:這個模型已經(jīng)成功地描述目標變量的變化了。因為R2R^2R2 分數(shù)已高達0.923,說明因變量的可預測程度非常高。


數(shù)據(jù)分割與重排

接下來,將分割波士頓房屋數(shù)據(jù)集,包括特征與目標變量、訓練集和測試集。通常在這個過程中,數(shù)據(jù)也會被重排,以消除數(shù)據(jù)集中由于順序而產(chǎn)生的偏差。

將data_df分割為特征和目標變量

# 分割 labels = data_df['SalePrice'] #TODO:提取SalePrice作為labels features = data_df.drop(['SalePrice'], axis=1) #TODO:提取除了SalePrice以外的特征賦值為features

下方代碼將實現(xiàn):

  • 使用 sklearn.model_selection 中的 train_test_split, 將 features 和 prices 的數(shù)據(jù)都分成用于訓練的數(shù)據(jù)子集和用于測試的數(shù)據(jù)子集。
    • 分割比例為:80%的數(shù)據(jù)用于訓練,20%用于測試;
    • 選定一個數(shù)值以設定 train_test_split 中的 random_state ,這會確保結果的一致性;
  • 將分割后的訓練集與測試集分配給 X_train, X_test, y_train 和 y_test。
# 引入 'train_test_split' from sklearn.model_selection import train_test_split# 打亂并分割訓練集與測試集 X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, random_state=1)# 成功~ print("Training and testing split was successful.") Training and testing split was successful.

訓練及測試

  • 將數(shù)據(jù)集按一定比例分為訓練用的數(shù)據(jù)集和測試用的數(shù)據(jù)集對學習算法能在一定程度上避免過擬合。

  • 如果用模型已經(jīng)見過的數(shù)據(jù),例如部分訓練集數(shù)據(jù)進行測試,會使得計算準確率時,這個得分會不可靠。



第四步. 分析模型的表現(xiàn)

在項目的第四步,我們來觀察不同參數(shù)下,模型在訓練集和驗證集上的表現(xiàn)。這里,我們專注于一個特定的算法(帶剪枝的決策樹DecisionTreeRegressor)和這個算法的一個參數(shù) 'max_depth'。
接下來,用全部訓練集訓練,選擇不同'max_depth' 參數(shù),觀察這一參數(shù)的變化如何影響模型的表現(xiàn)。并畫出模型的表現(xiàn)來分析。


學習曲線

下方區(qū)域內(nèi)的代碼會輸出四幅圖像,它們是一個決策樹模型在不同最大深度下的表現(xiàn)。每一條曲線都直觀得顯示了隨著訓練數(shù)據(jù)量的增加,模型學習曲線在訓練集評分和驗證集評分的變化,評分使用決定系數(shù) R2R^2R2。曲線的陰影區(qū)域代表的是該曲線的不確定性(用標準差衡量)。

# Produce learning curves for varying training set sizes and maximum depths vs.ModelLearning(features, labels)

學習曲線結論觀察

  • 對于上述圖像中的最大深度為 3 的那個,隨著訓練數(shù)據(jù)量的增加,訓練集曲線的評分減少,驗證集曲線的增加。
  • 如果有更多的訓練數(shù)據(jù),也無法提升模型的表現(xiàn),因訓練集曲線和驗證集曲線已相交在一個數(shù)值。

復雜度曲線

下列代碼內(nèi)的區(qū)域會輸出一幅圖像,它展示了一個已經(jīng)經(jīng)過訓練和驗證的決策樹模型在不同最大深度條件下的表現(xiàn)。這個圖形將包含兩條曲線,一個是訓練集的變化,一個是驗證集的變化。跟學習曲線相似,陰影區(qū)域代表該曲線的不確定性,模型訓練和測試部分的評分都用的 performance_metric 函數(shù)。

vs.ModelComplexity(X_train, y_train)


偏差(bias)與方差(variance)之間的權衡取舍

提示: 高偏差表示欠擬合(模型過于簡單),而高方差表示過擬合(模型過于復雜,以至于無法泛化)。

觀察結論:

  • 當模型以最大深度 1訓練時,模型的預測出現(xiàn)了很大的偏差。
  • 當模型以最大深度10訓練時,模型的預測出現(xiàn)了很大的方差。
  • 當模型以最大深度 1訓練時,訓練集得分和驗證集得分都較低,可見是欠擬合的情況。當模型以最大深度10訓練時,訓練集得分極高和驗證集得分不太高,而兩個得分相差甚大,可見是過擬合的情況。

最優(yōu)模型的猜測

  • 結合復雜度曲線,可見最大深度是 4 的模型能夠最好地對未見過的數(shù)據(jù)進行預測。
  • 依據(jù):隨著最大深度的增加,訓練集得分和驗證集得分都在增加,但當最大深度超過4后,驗證集得分反而有下降的趨勢,說明模型變得越來越復雜,逐漸變得過擬合。


第五步. 評估模型的表現(xiàn)

在項目的最后一節(jié)中,將構建一個模型,并使用 fit_model 中的優(yōu)化模型去預測客戶特征集。


網(wǎng)格搜索(Grid Search)

  • 網(wǎng)格搜索法是窮舉所有參數(shù)的組合,找出使模型得分最高的那個組合。比如在決策樹模型里,分別用幾個不同的深度參數(shù)去訓練模型并計算其測試集得分,測試集得分最高模型對應的深度參數(shù)便是最優(yōu)參數(shù)。
  • 優(yōu)化模型方法:嘗試所有參數(shù)的組合,以發(fā)現(xiàn)能使模型性能最好的參數(shù)組合。

交叉驗證

  • K折交叉驗證法(k-fold cross-validation)是隨機將訓練集劃分成K份,依次將其中的一份作為驗證集,其余的作為訓練集,訓練K個模型,最后選擇模型表現(xiàn)得最好的那一個。
  • GridSearchCV 是通過交叉驗證得到每個參數(shù)組合的得分,以確定最優(yōu)的參數(shù)組合。
  • GridSearchCV 中的'cv_results_'屬性能生成一個字典,記錄每組網(wǎng)格參數(shù)每次的訓練結果,包括訓練/驗證時間、訓練/驗證評估分數(shù)以及相關時間和評分的統(tǒng)計信息。
  • K折交叉驗證可以盡可能地嘗試所有的數(shù)據(jù)集劃分方式,使網(wǎng)格搜索的結果可信度更高。K折交叉驗證取多次結果的平均值可以避免樣本劃分不合理的情況。

訓練最優(yōu)模型

在這一步中,將使用決策樹算法訓練一個模型。為了得出的是一個最優(yōu)模型,需要使用網(wǎng)格搜索法訓練模型,以找到最佳的 'max_depth' 參數(shù)。可以把'max_depth' 參數(shù)理解為決策樹算法在做出預測前,允許其對數(shù)據(jù)提出問題的數(shù)量。

在下方 fit_model 函數(shù)中,將實現(xiàn):

  • 定義 'cross_validator' 變量: 使用 sklearn.model_selection 中的 KFold 創(chuàng)建一個交叉驗證生成器對象;
  • 定義 'regressor' 變量: 使用 sklearn.tree 中的 DecisionTreeRegressor 創(chuàng)建一個決策樹的回歸函數(shù);
  • 定義 'params' 變量: 為 'max_depth' 參數(shù)創(chuàng)造一個字典,它的值是從1至10的數(shù)組;
  • 定義 'scoring_fnc' 變量: 使用 sklearn.metrics 中的 make_scorer 創(chuàng)建一個評分函數(shù);
    將 ‘performance_metric’ 作為參數(shù)傳至這個函數(shù)中;
  • 定義 'grid' 變量: 使用 sklearn.model_selection 中的 GridSearchCV 創(chuàng)建一個網(wǎng)格搜索對象;將變量'regressor', 'params', 'scoring_fnc'和 'cross_validator' 作為參數(shù)傳至這個對象構造函數(shù)中;
  • # Import 'make_scorer', 'DecisionTreeRegressor', and 'GridSearchCV' from sklearn.metrics import make_scorer from sklearn.tree import DecisionTreeRegressor from sklearn.model_selection import GridSearchCV from sklearn.model_selection import KFolddef fit_model(X, y):""" Performs grid search over the 'max_depth' parameter for a decision tree regressor trained on the input data [X, y]. """cross_validator = KFold(n_splits=10)# Create a decision tree regressor objectregressor = DecisionTreeRegressor(random_state=1)# Create a dictionary for the parameter 'max_depth' with a range from 1 to 10params = {'max_depth':[i for i in range(1, 11)]}# Transform 'performance_metric' into a scoring function using 'make_scorer' scoring_fnc = make_scorer(performance_metric)# Create the grid search cv object --> GridSearchCV()# Make sure to include the right parameters in the object:# (estimator, param_grid, scoring, cv) which have values 'regressor', 'params', 'scoring_fnc', and 'cross_validator' respectively.grid = GridSearchCV(regressor, params, scoring_fnc, cv = cross_validator)# Fit the grid search object to the data to compute the optimal modelgrid = grid.fit(X, y)# Return the optimal model after fitting the datareturn grid.best_estimator_

    第六步. 做出預測

    當我們用數(shù)據(jù)訓練出一個模型,它就可用于對新的數(shù)據(jù)進行預測。在我們的例子–決策樹回歸函數(shù)中,模型已經(jīng)學會對新輸入的數(shù)據(jù)“提問”,并返回對目標變量的預測值。現(xiàn)在可以用這些預測來獲取未知目標變量的數(shù)據(jù)的信息,但是,輸入的新數(shù)據(jù)必須不能是已有訓練數(shù)據(jù)之中的。


    最優(yōu)模型

    下方代碼將決策樹回歸函數(shù)代入訓練數(shù)據(jù)的集合,以得到最優(yōu)化的模型。

    # Fit the training data to the model using grid search reg = fit_model(X_train, y_train)# Produce the value for 'max_depth' print("Parameter 'max_depth' is {} for the optimal model.".format(reg.get_params()['max_depth'])) Parameter 'max_depth' is 6 for the optimal model.

    最終,使用確認好的參數(shù)來對測試數(shù)據(jù)進行預測,并來看看訓練結果如何。

    depth = 6 regressor = DecisionTreeRegressor(max_depth = depth) regressor.fit(X_train, y_train) y_pred = regressor.predict(X_test) score = performance_metric(y_test, y_pred) print("The R2 score is ",score) The R2 score is 0.7520017488593774

    訓練結果情況:

    • 模型的效果并不理想。

    • 改進:1、需要更多的特征來訓練模型;2、數(shù)據(jù)預處理時,空值的填充用錯數(shù)值;3、試試換成線性回歸模型。

    總結

    以上是生活随笔為你收集整理的房价预测(基于决策树算法)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。