摘要:機(jī)器學(xué)習(xí)工程師納米學(xué)位模型評(píng)價(jià)與驗(yàn)證項(xiàng)目預(yù)測(cè)波士頓房?jī)r(jià)歡迎來(lái)到預(yù)測(cè)波士頓房?jī)r(jià)項(xiàng)目在此文件中,我們已經(jīng)提供了一些示例代碼,但你還需要完善更多功能才能讓項(xiàng)目成功運(yùn)行。
機(jī)器學(xué)習(xí)工程師納米學(xué)位 模型評(píng)價(jià)與驗(yàn)證 項(xiàng)目 1: 預(yù)測(cè)波士頓房?jī)r(jià)
歡迎來(lái)到預(yù)測(cè)波士頓房?jī)r(jià)項(xiàng)目!在此文件中,我們已經(jīng)提供了一些示例代碼,但你還需要完善更多功能才能讓項(xiàng)目成功運(yùn)行。除非有明確要求,你無(wú)需修改任何已給出的代碼。習(xí)題的標(biāo)題為編程練習(xí)。每一部分都會(huì)有詳細(xì)的指導(dǎo),需要實(shí)現(xiàn)的部分也會(huì)在注釋中以TODO標(biāo)出。請(qǐng)仔細(xì)閱讀所有的提示!
除了實(shí)現(xiàn)代碼外,你還必須回答一些問(wèn)題。請(qǐng)仔細(xì)閱讀每個(gè)問(wèn)題,并且在問(wèn)題后的"回答"文字框中寫(xiě)出完整的答案。我們的項(xiàng)目審閱者將會(huì)根據(jù)你對(duì)問(wèn)題的回答和撰寫(xiě)代碼所實(shí)現(xiàn)的功能來(lái)進(jìn)行評(píng)分。
提示:代碼 和 Markdown單元格 可通過(guò) Shift + Enter 快捷鍵運(yùn)行。另外,Markdown單元格 可以通過(guò)雙擊進(jìn)入編輯模式。
在這個(gè)項(xiàng)目中,你將使用我們提供的波士頓房屋信息數(shù)據(jù)來(lái)訓(xùn)練和測(cè)試一個(gè)模型,并對(duì)模型的性能和預(yù)測(cè)能力進(jìn)行評(píng)估。我們希望可以通過(guò)該模型實(shí)現(xiàn)對(duì)房屋的價(jià)值預(yù)估,提高房地產(chǎn)經(jīng)紀(jì)人的工作效率。
此項(xiàng)目的數(shù)據(jù)集來(lái)自kaggle原始數(shù)據(jù),未經(jīng)過(guò)任何處理。該數(shù)據(jù)集統(tǒng)計(jì)了2006年至2010年波士頓個(gè)人住宅銷(xiāo)售情況,包含2900多條觀測(cè)數(shù)據(jù)(其中一半是訓(xùn)練數(shù)據(jù),即我們的housedata.csv文件)。更多文檔信息可以參考作者的文檔(可以不看),以及項(xiàng)目附件data_description.txt文件(特征描述文件,一定要看)。
運(yùn)行下面區(qū)域的代碼以載入一些此項(xiàng)目所需的Python庫(kù)。如果成功返回提示語(yǔ)句,則說(shuō)明載入成功。
# 載入此項(xiàng)目需要的庫(kù) import numpy as np import pandas as pd import visuals as vs # Supplementary code 補(bǔ)充的可視化代碼 import matplotlib.pyplot as plt import seaborn as sns plt.style.use("seaborn") # use seaborn style 使用seaborn風(fēng)格 import warnings warnings.filterwarnings("ignore") %matplotlib inline print("你已經(jīng)成功載入所有庫(kù)!")
你已經(jīng)成功載入所有庫(kù)!編程練習(xí) 1:加載數(shù)據(jù)
你的第一個(gè)編程練習(xí)是加載波士頓房?jī)r(jià)數(shù)據(jù)。我們已為你導(dǎo)入了 Pandas ,你需要使用這個(gè)庫(kù)中的read_csv方法來(lái)執(zhí)行必要的過(guò)程。
導(dǎo)入數(shù)據(jù)將會(huì)是你整個(gè)項(xiàng)目的開(kāi)始
如果成功返回?cái)?shù)據(jù)集的大小,表示數(shù)據(jù)集已載入成功。
# 1 TODO:載入波士頓房屋的數(shù)據(jù)集:使用pandas載入csv,并賦值到data_df data_df = pd.read_csv("housedata.csv") # 成功載入的話輸出訓(xùn)練數(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.
這個(gè)部分,你要對(duì)已有的波士頓房地產(chǎn)數(shù)據(jù)進(jìn)行初步的觀察與處理。同時(shí),通過(guò)對(duì)數(shù)據(jù)的探索可以讓你更好地理解數(shù)據(jù)。
由于這個(gè)項(xiàng)目的最終目標(biāo)是建立一個(gè)預(yù)測(cè)房屋價(jià)值的模型,我們需要將數(shù)據(jù)集分為特征(features)和目標(biāo)變量(target variable)。
目標(biāo)變量: "SalePrice",是我們希望預(yù)測(cè)的變量。
特征:除 "SalePrice"外的屬性都是特征,它們反應(yīng)了數(shù)據(jù)點(diǎn)在某些方面的表現(xiàn)或性質(zhì)。
編程練習(xí) 2:觀察數(shù)據(jù)你的第二個(gè)編程練習(xí)是對(duì)波士頓房?jī)r(jià)的數(shù)據(jù)進(jìn)行觀察,這一步會(huì)讓你掌握更多數(shù)據(jù)本身的信息。具體問(wèn)題如下:
問(wèn)題2.1:使用head方法打印并觀察前7條data_df數(shù)據(jù)
# 2.1 TODO: 打印出前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]
問(wèn)題2.2:Id特征對(duì)我們訓(xùn)練數(shù)據(jù)沒(méi)有任何用處,在data_df中使用drop方法刪除"Id"列數(shù)據(jù)
# 2.2 TODO: 刪除data_df中的Id特征(保持?jǐn)?shù)據(jù)仍在data_df中,不更改變量名) data_df.drop(columns=["Id"], inplace=True)
問(wèn)題2.3:使用describe方法觀察data_df各個(gè)特征的統(tǒng)計(jì)信息:
# 2.3 TODO: data_df.describe(include=[np.number])
MSSubClass | LotFrontage | LotArea | OverallQual | OverallCond | YearBuilt | YearRemodAdd | MasVnrArea | BsmtFinSF1 | BsmtFinSF2 | ... | WoodDeckSF | OpenPorchSF | EnclosedPorch | 3SsnPorch | ScreenPorch | PoolArea | MiscVal | MoSold | YrSold | SalePrice | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
count | 1460.000000 | 1201.000000 | 1460.000000 | 1460.000000 | 1460.000000 | 1460.000000 | 1460.000000 | 1452.000000 | 1460.000000 | 1460.000000 | ... | 1460.000000 | 1460.000000 | 1460.000000 | 1460.000000 | 1460.000000 | 1460.000000 | 1460.000000 | 1460.000000 | 1460.000000 | 1460.000000 |
mean | 56.897260 | 70.049958 | 10516.828082 | 6.099315 | 5.575342 | 1971.267808 | 1984.865753 | 103.685262 | 443.639726 | 46.549315 | ... | 94.244521 | 46.660274 | 21.954110 | 3.409589 | 15.060959 | 2.758904 | 43.489041 | 6.321918 | 2007.815753 | 180921.195890 |
std | 42.300571 | 24.284752 | 9981.264932 | 1.382997 | 1.112799 | 30.202904 | 20.645407 | 181.066207 | 456.098091 | 161.319273 | ... | 125.338794 | 66.256028 | 61.119149 | 29.317331 | 55.757415 | 40.177307 | 496.123024 | 2.703626 | 1.328095 | 79442.502883 |
min | 20.000000 | 21.000000 | 1300.000000 | 1.000000 | 1.000000 | 1872.000000 | 1950.000000 | 0.000000 | 0.000000 | 0.000000 | ... | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 1.000000 | 2006.000000 | 34900.000000 |
25% | 20.000000 | 59.000000 | 7553.500000 | 5.000000 | 5.000000 | 1954.000000 | 1967.000000 | 0.000000 | 0.000000 | 0.000000 | ... | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 5.000000 | 2007.000000 | 129975.000000 |
50% | 50.000000 | 69.000000 | 9478.500000 | 6.000000 | 5.000000 | 1973.000000 | 1994.000000 | 0.000000 | 383.500000 | 0.000000 | ... | 0.000000 | 25.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 6.000000 | 2008.000000 | 163000.000000 |
75% | 70.000000 | 80.000000 | 11601.500000 | 7.000000 | 6.000000 | 2000.000000 | 2004.000000 | 166.000000 | 712.250000 | 0.000000 | ... | 168.000000 | 68.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 8.000000 | 2009.000000 | 214000.000000 |
max | 190.000000 | 313.000000 | 215245.000000 | 10.000000 | 9.000000 | 2010.000000 | 2010.000000 | 1600.000000 | 5644.000000 | 1474.000000 | ... | 857.000000 | 547.000000 | 552.000000 | 508.000000 | 480.000000 | 738.000000 | 15500.000000 | 12.000000 | 2010.000000 | 755000.000000 |
# data_df.info() #查看dataFrame的信息編程練習(xí)3: 數(shù)據(jù)預(yù)處理
我們的數(shù)據(jù)不可能是百分百的‘干凈’數(shù)據(jù)(即有用數(shù)據(jù)),總會(huì)在采集整理時(shí)有些”失誤“、“冗余”,造成“臟”數(shù)據(jù),所以我們要從數(shù)據(jù)的正確性和完整性這兩個(gè)方面來(lái)清理數(shù)據(jù)。
正確性:一般是指有沒(méi)有異常值,比如我們這個(gè)數(shù)據(jù)集中作者的文檔所說(shuō):
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"中超過(guò)4000平方英尺的房屋(具體原因可以參考文檔),當(dāng)然本數(shù)據(jù)集還有其他的異常點(diǎn),這里不再處理。
完整性:采集或者整理數(shù)據(jù)時(shí)所產(chǎn)生的空數(shù)據(jù)造成了數(shù)據(jù)的完整性缺失,通常我們會(huì)使用一定的方法處理不完整的數(shù)據(jù)。在本例中,我們使用以下兩種方法,一是丟棄數(shù)據(jù),即選擇丟棄過(guò)多空數(shù)據(jù)的特征(或者直接丟棄數(shù)據(jù)行,前提是NA數(shù)據(jù)占比不多),二是填補(bǔ)數(shù)據(jù),填補(bǔ)的方法也很多,均值中位數(shù)眾數(shù)填充等等都是好方法。
問(wèn)題3.1:正確性
請(qǐng)按下述步驟刪除一些不合理的數(shù)據(jù)
問(wèn)題3.1.1:使用matplotlib庫(kù)中的scatter方法 繪制"GrLivArea"和"SalePrice"的散點(diǎn)圖,x軸為"GrLivArea",y軸為"SalePrice",觀察數(shù)據(jù)
# 3.1.1 TODO:繪制要求的圖形 plt.scatter(data_df["GrLivArea"], data_df["SalePrice"], c="blue", marker=".", s=30) plt.xlabel("GrLivArea") plt.ylabel("SalePrice") plt.show()
問(wèn)題3.1.2:通過(guò)上圖我們可以看到那幾個(gè)異常值,即"GrLivArea"大于4000,但是"SalePrice"又極低的數(shù)據(jù),從data_df刪除這幾個(gè)異常值,刪除后重新繪制"GrLivArea"和"SalePrice"的關(guān)系圖,確認(rèn)異常值已刪除。
# 3.1.2 # TODO:從data_df中刪除 GrLivArea大于4000 且 SalePrice低于300000 的值 index = data_df[(data_df["GrLivArea"] > 4000) & (data_df["SalePrice"] < 300000)].index data_df.drop(index=index, inplace=True) # TODO:重新繪制GrLivArea和SalePrice的關(guān)系圖,確認(rèn)異常值已刪除 plt.scatter(data_df["GrLivArea"], data_df["SalePrice"], c="blue", marker=".", s=50) plt.xlabel("GrLivArea") plt.ylabel("SalePrice") plt.show()
問(wèn)題3.2:完整性
請(qǐng)按下述步驟,補(bǔ)足數(shù)據(jù)的完整性
問(wèn)題3.2.1:篩選出過(guò)多空數(shù)據(jù)的特征,我們這個(gè)項(xiàng)目定為篩選出有超過(guò)25%為空數(shù)據(jù)的特征
limit_percent = 0.25 limit_value = len(data_df) * limit_percent # 3.2.1 TODO 統(tǒng)計(jì)并打印出超過(guò)25%的空數(shù)據(jù)的特征,你可以考慮使用isna() list(data_df.columns[data_df.isna().sum() > limit_value])
["Alley", "FireplaceQu", "PoolQC", "Fence", "MiscFeature"]
如果你整理出的特征是"Alley", "FireplaceQu", "PoolQC", "Fence", "MiscFeature",那就說(shuō)明你統(tǒng)計(jì)對(duì)了,接著我們查看data_description.txt文件,就會(huì)發(fā)現(xiàn),這些并非一定是空缺數(shù)據(jù),而沒(méi)有游泳池,籬笆等也會(huì)用NA來(lái)表示,那么就不需要?jiǎng)h除這些特征了,而是用None來(lái)填充NA數(shù)據(jù)。
問(wèn)題3.2.2:根據(jù)data_description.txt特征描述,使用fillna方法填充空數(shù)據(jù),具體哪一種數(shù)據(jù)需要填充什么已經(jīng)整理好了,請(qǐng)按提示要求來(lái)進(jìn)行填充
# 直接運(yùn)行不用修改 # 確定所有空特征 missing_columns = list(data_df.columns[data_df.isnull().sum() != 0]) # 確定哪些是類(lèi)別特征,哪些是數(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"]
data_df.mode() # 取眾數(shù),返回DataFrame
MSSubClass | MSZoning | LotFrontage | LotArea | Street | Alley | LotShape | LandContour | Utilities | LotConfig | ... | PoolArea | PoolQC | Fence | MiscFeature | MiscVal | MoSold | YrSold | SaleType | SaleCondition | SalePrice | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 20.0 | RL | 60.0 | 7200.0 | Pave | Grvl | Reg | Lvl | AllPub | Inside | ... | 0.0 | Ex | MnPrv | Shed | 0.0 | 6.0 | 2009.0 | WD | Normal | 140000.0 |
1 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | Fa | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
2 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | Gd | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
# 需要填充眾數(shù)的特征 fill_Mode = ["Electrical"] # 需要填充N(xiāo)one的特征 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"] # 3.4.1 TODO:按需填補(bǔ)上面數(shù)據(jù) # 我的實(shí)現(xiàn): # # 填充眾數(shù): # mode = data_df[fill_Mode].mode().iloc[0,0] # data_df.fillna(value={fill_Mode[0]: mode}, inplace=True) # # 填充N(xiāo)one: # d_None={} # for i in fill_None: # d_None[i] = "None" # data_df.fillna(value=d_None, inplace=True) # # 填充0: # data_df[fill_0].fillna(value=0, inplace=True) # # 填充中位數(shù): # data_df[fill_median].fillna(data_df[fill_median].median(), inplace=True) # 簡(jiǎn)化實(shí)現(xiàn): 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].median()) # 驗(yàn)證 # data_df.isna().sum()編程練習(xí)4: 特征分析
有這么一句話在業(yè)界廣泛流傳:特征數(shù)據(jù)決定了機(jī)器學(xué)習(xí)的上限,而模型和算法只是逼近這個(gè)上限而已。特征工程,是整個(gè)數(shù)據(jù)分析過(guò)程中不可缺少的一個(gè)環(huán)節(jié),其結(jié)果質(zhì)量直接關(guān)系到模型效果和最終結(jié)論。從上面兩步中我們得到了“干凈”的數(shù)據(jù),但是data_df總共有81個(gè)特征,我們應(yīng)當(dāng)剔除那些無(wú)關(guān)緊要的特征(噪聲),使用真正關(guān)鍵的特征來(lái)進(jìn)行模型訓(xùn)練。現(xiàn)在需要我們對(duì)這些龐大的數(shù)據(jù)進(jìn)行分析,提取出與目標(biāo)最為關(guān)聯(lián)的數(shù)據(jù)。
問(wèn)題4.1:繪制"SalePrice"的直方圖,并說(shuō)明該直方圖屬于什么分布
# 4.1 TODO:繪制要求的圖形 # plt.hist(data_df["SalePrice"], bins=50, normed=False, color=None) # plt.xlabel("SalePrice") # plt.show() data_df["SalePrice"].hist(bins=50)
回答問(wèn)題4.1:"SalePrice"屬于 正偏態(tài) 分布
import scipy scipy.stats.skew(data_df["SalePrice"])
1.8793604459195012
結(jié)果>0,代表正偏,從計(jì)算上也說(shuō)明了"SalePrice"屬于正偏態(tài)分布。
如果特征極其多,很難清晰的看到特征與目標(biāo)變量之間的關(guān)系,就需要利用統(tǒng)計(jì)知識(shí)來(lái)進(jìn)行多變量分析了。我們常使用熱圖heatmap結(jié)合corr方法來(lái)進(jìn)行客觀分析,熱圖Heatmap可以用顏色變化來(lái)反映變量之間的相關(guān)性二維矩陣或說(shuō)相關(guān)性表格中的數(shù)據(jù)信息,它可以直觀地將數(shù)據(jù)值的大小以定義的顏色深淺表示出來(lái)。這個(gè)項(xiàng)目,為了簡(jiǎn)化訓(xùn)練,我們以相關(guān)性絕對(duì)值大于0.5為界來(lái)選取我們需要的特征。
# 不用修改直接運(yùn)行 corrmat = data_df.corr().abs() #計(jì)算連續(xù)型特征之間的相關(guān)系數(shù) #將于SalePrice的相關(guān)系數(shù)大于5的特征取出來(lái),并按照SalePrice降序排列,然后取出對(duì)應(yīng)的特征名,保存在列表中 top_corr = corrmat[corrmat["SalePrice"]>0.5].sort_values(by = ["SalePrice"], ascending = False).index cm = abs(np.corrcoef(data_df[top_corr].values.T)) #注意這里要轉(zhuǎn)置,否則變成樣本之間的相關(guān)系數(shù),而我們要計(jì)算的是特征之間的相關(guān)系數(shù) 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]
我們已經(jīng)從龐大的特征群中篩選出了最相關(guān)的特征,也了解了我們目標(biāo)數(shù)據(jù)的分布,那么接下來(lái),我們從創(chuàng)造性方面來(lái)對(duì)我們的特征進(jìn)行“改造”。
創(chuàng)造性:創(chuàng)造性主要是說(shuō)兩種情況,一種是對(duì)現(xiàn)有數(shù)據(jù)的處理,比如對(duì)類(lèi)別的獨(dú)熱編碼(One-hotEncoder)或者標(biāo)簽編碼(LabelEncoder),數(shù)值的區(qū)間縮放,歸一化,標(biāo)準(zhǔn)化等等,另一種就是根據(jù)某一個(gè)或多個(gè)特征創(chuàng)造一個(gè)新的特征,例如某特征按組分類(lèi)(groupby)后,或者某些特征組合后來(lái)創(chuàng)造新特征等等。
因?yàn)槲覀兒Y選出來(lái)的特征都為數(shù)值類(lèi)型特征,所以我們只做標(biāo)準(zhǔn)化的操作:這個(gè)項(xiàng)目是一個(gè)回歸類(lèi)型的項(xiàng)目,而我們的回歸算法對(duì)標(biāo)準(zhǔn)正態(tài)分步預(yù)測(cè)較為準(zhǔn)確,從我們的目標(biāo)數(shù)據(jù)可以看出數(shù)據(jù)是一個(gè)偏態(tài)分布,那么我們使用log將數(shù)據(jù)從偏態(tài)分布轉(zhuǎn)換為標(biāo)準(zhǔn)正態(tài)分布,最后進(jìn)行標(biāo)準(zhǔn)化。
# 不要修改,直接運(yùn)行 from scipy.special import boxcox1p from sklearn.preprocessing import StandardScaler data_df["SalePrice"] = np.log1p(data_df["SalePrice"]) # np.log1p()函數(shù)將數(shù)據(jù)從偏態(tài)分布轉(zhuǎn)換成標(biāo)準(zhǔn)正態(tài)分布 numeric_features = list(data_df.columns) numeric_features.remove("SalePrice") for feature in numeric_features: #all_data[feat] += 1 data_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])
筆記:
對(duì)目標(biāo)變量的變換np.loglp():這個(gè)函數(shù)用來(lái)在數(shù)據(jù)預(yù)處理過(guò)程對(duì)偏度較大的數(shù)據(jù)進(jìn)行平滑處理,使其更加符合高斯分布,有利于后續(xù)得到一個(gè)更好地結(jié)果,數(shù)學(xué)公式:ln(x+1).
對(duì)數(shù)值類(lèi)型的特征變量的變換boxcox1p():對(duì)于數(shù)值類(lèi)型為數(shù)值的特征變量,也需要進(jìn)行類(lèi)似的變換。通過(guò)統(tǒng)計(jì)每一變量的skew值(偏度/偏態(tài)值,越接近0,越符合正態(tài)分布。大于0為正偏態(tài),小于0為負(fù)偏態(tài)),對(duì)絕對(duì)值大于0.5的進(jìn)行boxcox變換??梢允咕€性回歸模型滿足線性性、獨(dú)立性、方差齊性以及正態(tài)性的同時(shí),又不丟失信息,此種變換稱(chēng)之為Box—Cox變換。$$y=frac{x^{lambda}-1}{lambda},lambda != 0 y=log(x),lambda == 0$$Box-Cox變換后,殘差可以更好的滿足正態(tài)性、獨(dú)立性等假設(shè)前提,降低了偽回歸的概率
在項(xiàng)目的第三步中,你需要了解必要的工具和技巧來(lái)讓你的模型能夠進(jìn)行預(yù)測(cè)。用這些工具和技巧對(duì)每一個(gè)模型的表現(xiàn)做精確的衡量可以極大地增強(qiáng)你預(yù)測(cè)的可信度。
編程練習(xí)5:定義衡量標(biāo)準(zhǔn)如果不能對(duì)模型的訓(xùn)練和測(cè)試的表現(xiàn)進(jìn)行量化地評(píng)估,我們就很難衡量模型的好壞。通常我們會(huì)定義一些衡量標(biāo)準(zhǔn),這些標(biāo)準(zhǔn)可以通過(guò)對(duì)某些誤差或者擬合程度的計(jì)算來(lái)得到。在這個(gè)項(xiàng)目中,你將通過(guò)運(yùn)算決定系數(shù) $R^2$ 來(lái)量化模型的表現(xiàn)。模型的決定系數(shù)是回歸分析中十分常用的統(tǒng)計(jì)信息,經(jīng)常被當(dāng)作衡量模型預(yù)測(cè)能力好壞的標(biāo)準(zhǔn)。
$R^2$ 的數(shù)值范圍從0至1,表示目標(biāo)變量的預(yù)測(cè)值和實(shí)際值之間的相關(guān)程度平方的百分比。一個(gè)模型的 $R^2$ 值為0還不如直接用平均值來(lái)預(yù)測(cè)效果好;而一個(gè) $R^2$ 值為1的模型則可以對(duì)目標(biāo)變量進(jìn)行完美的預(yù)測(cè)。從0至1之間的數(shù)值,則表示該模型中目標(biāo)變量中有百分之多少能夠用特征來(lái)解釋。模型也可能出現(xiàn)負(fù)值的 $R^2$,這種情況下模型所做預(yù)測(cè)有時(shí)會(huì)比直接計(jì)算目標(biāo)變量的平均值差很多。
問(wèn)題5.1:
在下方代碼的 performance_metric 函數(shù)中,你要實(shí)現(xiàn):
使用 sklearn.metrics 中的 r2_score 來(lái)計(jì)算 y_true 和 y_predict 的 $R^2$ 值,作為對(duì)其表現(xiàn)的評(píng)判。
將他們的表現(xiàn)評(píng)分儲(chǔ)存到 score 變量中。
# 5.1 TODO: 引入 "r2_score" from sklearn.metrics import r2_score def performance_metric(y_true, y_predict): """ Calculates and returns the performance score between true and predicted values based on the metric chosen. """ # TODO: 計(jì)算 "y_true" 與 "y_predict" 的r2值 score = r2_score(y_true, y_predict) # 返回這一分?jǐn)?shù) return score
筆記:
R^2是評(píng)價(jià)模型表現(xiàn)的方法之一,每個(gè)機(jī)器學(xué)習(xí)模型的建立都要有相對(duì)應(yīng)的評(píng)價(jià)指標(biāo),后面我們會(huì)學(xué)到更多的評(píng)價(jià)指標(biāo)。不過(guò)R^2其實(shí)也有很多局限性需要注意 https://en.wikipedia.org/wiki...
skearn對(duì)于常見(jiàn)的模型表現(xiàn)衡量方法也有詳細(xì)的介紹。
http://scikit-learn.org/stabl...
問(wèn)題 5.2:擬合程度
假設(shè)一個(gè)數(shù)據(jù)集有五個(gè)數(shù)據(jù)且某一模型做出下列目標(biāo)變量的預(yù)測(cè):
真實(shí)數(shù)值 | 預(yù)測(cè)數(shù)值 |
---|---|
3.0 | 2.5 |
-0.5 | 0.0 |
2.0 | 2.1 |
7.0 | 7.8 |
4.2 | 5.3 |
你覺(jué)得這個(gè)模型已成功地描述了目標(biāo)變量的變化嗎?如果成功,請(qǐng)解釋為什么,如果沒(méi)有,也請(qǐng)給出原因。
提示1:運(yùn)行下方的代碼,使用 performance_metric 函數(shù)來(lái)計(jì)算 y_true 和 y_predict 的決定系數(shù)。
提示2:$R^2$ 分?jǐn)?shù)是指可以從自變量中預(yù)測(cè)的因變量的方差比例。 換一種說(shuō)法:
$R^2$ 為0意味著因變量不能從自變量預(yù)測(cè)。
$R^2$ 為1意味著可以從自變量預(yù)測(cè)因變量。
$R^2$ 在0到1之間表示因變量可預(yù)測(cè)的程度。
$R^2$ 為0.40意味著 Y 中40%的方差可以從 X 預(yù)測(cè)。
#TODO 5.2:計(jì)算這一模型的表現(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.
問(wèn)題 5.2 - 回答:模型可以描述目標(biāo)變量的變化,因?yàn)镽^2值為0.923,說(shuō)明自變量(預(yù)測(cè)數(shù)值)對(duì)因變量(真實(shí)數(shù)值)的解釋越好。
編程練習(xí) 6: 數(shù)據(jù)分割與重排接下來(lái),你需要分割波士頓房屋數(shù)據(jù)集,包括特征與目標(biāo)變量、訓(xùn)練集和測(cè)試集。通常在這個(gè)過(guò)程中,數(shù)據(jù)也會(huì)被重排,以消除數(shù)據(jù)集中由于順序而產(chǎn)生的偏差。
在下面的代碼中,你需要
問(wèn)題6.1:將data_df分割為特征和目標(biāo)變量
# TODO: 6.1 labels = data_df["SalePrice"]#TODO:提取SalePrice作為labels features = data_df.drop(["SalePrice"], axis=1)#TODO:提取除了SalePrice以外的特征賦值為features
問(wèn)題6.2 :
使用 sklearn.model_selection 中的 train_test_split, 將 features 和 prices 的數(shù)據(jù)都分成用于訓(xùn)練的數(shù)據(jù)子集和用于測(cè)試的數(shù)據(jù)子集。
分割比例為:80%的數(shù)據(jù)用于訓(xùn)練,20%用于測(cè)試;
選定一個(gè)數(shù)值以設(shè)定 train_test_split 中的 random_state ,這會(huì)確保結(jié)果的一致性;
將分割后的訓(xùn)練集與測(cè)試集分配給 X_train, X_test, y_train 和 y_test。
# TODO: 引入 "train_test_split" from sklearn.model_selection import train_test_split # TODO: 打亂并分割訓(xùn)練集與測(cè)試集 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.
問(wèn)題 6.3 - 訓(xùn)練及測(cè)試
將數(shù)據(jù)集按一定比例分為訓(xùn)練用的數(shù)據(jù)集和測(cè)試用的數(shù)據(jù)集對(duì)學(xué)習(xí)算法有什么好處?
如果用模型已經(jīng)見(jiàn)過(guò)的數(shù)據(jù),例如部分訓(xùn)練集數(shù)據(jù)進(jìn)行測(cè)試,又有什么壞處?
提示: 如果沒(méi)有數(shù)據(jù)來(lái)對(duì)模型進(jìn)行測(cè)試,會(huì)出現(xiàn)什么問(wèn)題?
問(wèn)題 6.3 - 回答:
將數(shù)據(jù)集按一定比例分為訓(xùn)練用的數(shù)據(jù)集和測(cè)試用的數(shù)據(jù)集對(duì)學(xué)習(xí)算法可以對(duì)算法進(jìn)行驗(yàn)證,在一定程度上避免算法過(guò)擬合;
如果部分訓(xùn)練數(shù)據(jù)進(jìn)行測(cè)試,會(huì)使得算法的準(zhǔn)確率不可靠;
如果沒(méi)有數(shù)據(jù)進(jìn)行測(cè)試,無(wú)法說(shuō)明模型的優(yōu)劣。
將數(shù)據(jù)集分成訓(xùn)練集和測(cè)試集的好處:既可以用于訓(xùn)練又可以用于測(cè)試,而且不會(huì)相互干擾,而且可以對(duì)訓(xùn)練模型進(jìn)行有效的驗(yàn)證。
用部分訓(xùn)練集進(jìn)行測(cè)試的壞處:模型就是根據(jù)訓(xùn)練集得出的,使用訓(xùn)練集進(jìn)行測(cè)試肯定會(huì)得出較好的結(jié)果,這不能判斷訓(xùn)練模型的優(yōu)劣。
在項(xiàng)目的第四步,我們來(lái)觀察不同參數(shù)下,模型在訓(xùn)練集和驗(yàn)證集上的表現(xiàn)。這里,我們專(zhuān)注于一個(gè)特定的算法(帶剪枝的決策樹(shù)DecisionTreeRegressor,但這并不是這個(gè)項(xiàng)目的重點(diǎn))和這個(gè)算法的一個(gè)參數(shù) "max_depth"。用全部訓(xùn)練集訓(xùn)練,選擇不同"max_depth" 參數(shù),觀察這一參數(shù)的變化如何影響模型的表現(xiàn)。畫(huà)出模型的表現(xiàn)來(lái)對(duì)于分析過(guò)程十分有益。
學(xué)習(xí)曲線下方區(qū)域內(nèi)的代碼會(huì)輸出四幅圖像,它們是一個(gè)決策樹(shù)模型在不同最大深度下的表現(xiàn)。每一條曲線都直觀得顯示了隨著訓(xùn)練數(shù)據(jù)量的增加,模型學(xué)習(xí)曲線在訓(xùn)練集評(píng)分和驗(yàn)證集評(píng)分的變化,評(píng)分使用決定系數(shù) $R^2$。曲線的陰影區(qū)域代表的是該曲線的不確定性(用標(biāo)準(zhǔn)差衡量)。
運(yùn)行下方區(qū)域中的代碼,并利用輸出的圖形回答下面的問(wèn)題。
# Produce learning curves for varying training set sizes and maximum depths vs.ModelLearning(features, labels)問(wèn)題 7 - 學(xué)習(xí)曲線
選擇上述圖像中的其中一個(gè),并給出其最大深度。
隨著訓(xùn)練數(shù)據(jù)量的增加,訓(xùn)練集曲線的評(píng)分有怎樣的變化?驗(yàn)證集曲線呢?
如果有更多的訓(xùn)練數(shù)據(jù),是否能有效提升模型的表現(xiàn)呢?
提示:學(xué)習(xí)曲線的評(píng)分是否最終會(huì)收斂到特定的值?一般來(lái)說(shuō),你擁有的數(shù)據(jù)越多,模型表現(xiàn)力越好。但是,如果你的訓(xùn)練和測(cè)試曲線以高于基準(zhǔn)閾值的分?jǐn)?shù)收斂,這是否有必要?基于訓(xùn)練和測(cè)試曲線已經(jīng)收斂的前提下,思考添加更多訓(xùn)練點(diǎn)的優(yōu)缺點(diǎn)。
問(wèn)題 7 - 回答:當(dāng)max_depth為3時(shí),隨著訓(xùn)練數(shù)據(jù)的增加,訓(xùn)練集曲線的評(píng)分降低,驗(yàn)證集曲線的評(píng)分提高,但是兩者會(huì)收斂到一特定數(shù)值,隨著訓(xùn)練數(shù)據(jù)的增加,模型表現(xiàn)不再提高,此時(shí)沒(méi)有必要再繼續(xù)增加訓(xùn)練數(shù)據(jù),因?yàn)闀?huì)增加模型的訓(xùn)練時(shí)間。但是,如果在過(guò)擬合的情況下,比方說(shuō)當(dāng)max_depth為6或者10時(shí),隨著訓(xùn)練數(shù)據(jù)的增加,模型表現(xiàn)也不斷提高,此時(shí)反而有必要增加訓(xùn)練數(shù)據(jù)。
筆記:
對(duì)訓(xùn)練曲線和測(cè)試曲線趨勢(shì)和意義解釋的很好。這里隨著數(shù)據(jù)的增多,max_depth不變的情況下,模型提升的幅度也越來(lái)越小。
傳統(tǒng)的機(jī)器學(xué)習(xí)算法(又被稱(chēng)為基于統(tǒng)計(jì)的機(jī)器學(xué)習(xí))在數(shù)據(jù)量達(dá)到一定程度后,更多的數(shù)據(jù)無(wú)法提升模型的表現(xiàn)。深度學(xué)習(xí)的一個(gè)優(yōu)勢(shì)就是它可以把大量的數(shù)據(jù)利用起來(lái),提升學(xué)習(xí)表現(xiàn)。
這里還有更多關(guān)于學(xué)習(xí)曲線的介紹:
https://www.coursera.org/lear...
http://scikit-learn.org/stabl...
傳統(tǒng)的機(jī)器學(xué)習(xí)算法(又被稱(chēng)為基于統(tǒng)計(jì)的機(jī)器學(xué)習(xí))在數(shù)據(jù)量達(dá)到一定程度后,更多的數(shù)據(jù)無(wú)法提升模型的表現(xiàn)。深度學(xué)習(xí)的一個(gè)優(yōu)勢(shì)就是它可以把大量的數(shù)據(jù)利用起來(lái),提升學(xué)習(xí)表現(xiàn)。
這里還有更多關(guān)于學(xué)習(xí)曲線的介紹:
https://www.coursera.org/lear...
http://scikit-learn.org/stabl...
下列代碼內(nèi)的區(qū)域會(huì)輸出一幅圖像,它展示了一個(gè)已經(jīng)經(jīng)過(guò)訓(xùn)練和驗(yàn)證的決策樹(shù)模型在不同最大深度條件下的表現(xiàn)。這個(gè)圖形將包含兩條曲線,一個(gè)是訓(xùn)練集的變化,一個(gè)是驗(yàn)證集的變化。跟學(xué)習(xí)曲線相似,陰影區(qū)域代表該曲線的不確定性,模型訓(xùn)練和測(cè)試部分的評(píng)分都用的 performance_metric 函數(shù)。
運(yùn)行下方區(qū)域中的代碼,根據(jù)問(wèn)題5與問(wèn)題6對(duì)輸出的圖形進(jìn)行分析并給出你思考的結(jié)果。
vs.ModelComplexity(X_train, y_train)問(wèn)題 8 - 偏差(bias)與方差(variance)之間的權(quán)衡取舍
當(dāng)模型以最大深度 1訓(xùn)練時(shí),模型的預(yù)測(cè)是出現(xiàn)很大的偏差還是出現(xiàn)了很大的方差?
當(dāng)模型以最大深度10訓(xùn)練時(shí),情形又如何呢?
圖形中的哪些特征能夠支持你的結(jié)論?
提示: 高偏差表示欠擬合(模型過(guò)于簡(jiǎn)單),而高方差表示過(guò)擬合(模型過(guò)于復(fù)雜,以至于無(wú)法泛化)。考慮哪種模型(深度1或10)對(duì)應(yīng)著上述的情況,并權(quán)衡偏差與方差。
問(wèn)題 8 - 回答:當(dāng)max_depth為1時(shí),模型表現(xiàn)出高偏差,因?yàn)橛?xùn)練集和測(cè)試集的R2分?jǐn)?shù)都比較低;當(dāng)max_depth為10時(shí),模型表現(xiàn)出高方差,因?yàn)橛?xùn)練集的R2分?jǐn)?shù)較高,而驗(yàn)證集的R2分?jǐn)?shù)較低。
筆記:
偏差-方差分解是解釋學(xué)習(xí)算法泛化性能的重要工具。這里你需要理解三個(gè)方面:
什么是泛化誤差(Generalization error):
如果學(xué)得到的模型是 f ,那么用這個(gè)模型對(duì)測(cè)試數(shù)據(jù)預(yù)測(cè)的誤差即為泛化誤差。一般所說(shuō)的泛化誤差都是算法的期望泛化誤差。
Bias-Variance分解:
現(xiàn)在我們來(lái)看題目中的方差和偏差到底是什么意思?通過(guò)簡(jiǎn)單的多項(xiàng)式展開(kāi)合并,可以對(duì)算法的期望泛化誤差進(jìn)行分解可以得到(具體推到過(guò)程請(qǐng)參考[1]、[2]) :
也就是說(shuō):泛化誤差=偏差+方差+噪聲
偏差度量了學(xué)習(xí)算法的期望預(yù)測(cè)和真實(shí)結(jié)果的偏離程度,即刻畫(huà)了學(xué)習(xí)算法本身的擬合能力。
方差度量了同樣大小的訓(xùn)練集的變動(dòng)所導(dǎo)致的學(xué)習(xí)性能的變化, 即 刻畫(huà)了數(shù)據(jù)擾動(dòng)所造成的影響。
Bias-Variance trade-off:
一般情況下,偏差和方差是有沖突的,如下圖所示。為了取得好的泛化性能,則需要偏差較小,即能夠充分?jǐn)M合數(shù)據(jù),并且方差較小,即使得數(shù)據(jù)擾動(dòng)產(chǎn)生的影響小。
欠擬合:在訓(xùn)練不足時(shí),學(xué)習(xí)的擬合能力不夠強(qiáng),訓(xùn)練數(shù)據(jù)的擾動(dòng)不足以使學(xué)習(xí)器產(chǎn)生顯著變化,偏差主導(dǎo)了泛化錯(cuò)誤率。
過(guò)擬合:充分訓(xùn)練后, 學(xué)習(xí)器的擬合能力已非常強(qiáng), 訓(xùn)練數(shù)據(jù)的輕微擾動(dòng)都會(huì)導(dǎo)致學(xué)習(xí)器發(fā)生顯著變化, 訓(xùn)練數(shù)據(jù)自身的、非全局的特性被學(xué)習(xí)器學(xué)到了,方差主導(dǎo)了泛化錯(cuò)誤率。
更多內(nèi)容請(qǐng)閱讀參考資料。
參考資料:
[1] ?機(jī)器學(xué)習(xí)?, 周志華, 2.5 節(jié)偏差與方差.
[2] Understanding the Bias-Variance Tradeoff
問(wèn)題 9- 最優(yōu)模型的猜測(cè)結(jié)合復(fù)雜度曲線,你認(rèn)為最大深度是多少的模型能夠最好地對(duì)未見(jiàn)過(guò)的數(shù)據(jù)進(jìn)行預(yù)測(cè)?
你得出這個(gè)答案的依據(jù)是什么?
提示:查看問(wèn)題8上方的圖表,并查看模型在不同 depth下的驗(yàn)證分?jǐn)?shù)。隨著深度的增加模型的表現(xiàn)力會(huì)變得更好嗎?我們?cè)谑裁辞闆r下獲得最佳驗(yàn)證分?jǐn)?shù)而不會(huì)使我們的模型過(guò)度復(fù)雜?請(qǐng)記住,奧卡姆剃刀:“在競(jìng)爭(zhēng)性假設(shè)中,應(yīng)該選擇假設(shè)最少的那一個(gè)。”
問(wèn)題 9 - 回答:
隨著深度的增加模型表現(xiàn)并沒(méi)有越來(lái)越好,驗(yàn)證集在max_depth為4時(shí),模型收斂,并且訓(xùn)練R2分?jǐn)?shù)和驗(yàn)證R2較高。
隨著最大深度的提升,訓(xùn)練集R2分?jǐn)?shù)不斷上升,驗(yàn)證集R2分?jǐn)?shù)并沒(méi)有得到提高,反而有下降的趨勢(shì),說(shuō)明隨著模型變得復(fù)雜,模型過(guò)擬合。
考慮模型的復(fù)雜度和R2分?jǐn)?shù),最大深度為4的模型具有最好的泛化能力。
在項(xiàng)目的最后一節(jié)中,你將構(gòu)建一個(gè)模型,并使用 fit_model 中的優(yōu)化模型去預(yù)測(cè)客戶(hù)特征集。
問(wèn)題 10- 網(wǎng)格搜索(Grid Search)什么是網(wǎng)格搜索法?
如何用它來(lái)優(yōu)化模型?
提示:在解釋網(wǎng)格搜索算法時(shí),首先要理解我們?yōu)槭裁词褂镁W(wǎng)格搜索算法,以及我們使用它的最終目的是什么。為了使你的回答更具有說(shuō)服力,你還可以給出一個(gè)模型中可以使用此方法進(jìn)行優(yōu)化參數(shù)的示例。
問(wèn)題 10 - 回答: 網(wǎng)格搜索法是給定參數(shù)值,窮舉搜索尋找最優(yōu)參數(shù)的算法。網(wǎng)格搜索法通過(guò)構(gòu)建一個(gè)參數(shù)的字典,創(chuàng)造出不同的參數(shù)組合,輸入給分類(lèi)器進(jìn)行訓(xùn)練,采用交叉驗(yàn)證,尋找驗(yàn)證分?jǐn)?shù)最高的那一組參數(shù),這一組參數(shù)就是模型的最優(yōu)參數(shù)。
網(wǎng)格搜索算法是一種窮舉搜索的算法。
在所有候選的參數(shù)選擇中,通過(guò)循環(huán)遍歷,嘗試每一種可能性,表現(xiàn)最好的參數(shù)就是最終的結(jié)果。其原理就像是在數(shù)組里找最大值。以有兩個(gè)參數(shù)的模型為例,參數(shù)a有3種可能,參數(shù)b有4種可能,把所有可能性列出來(lái),可以表示成一個(gè)3*4的表格,其中每個(gè)cell就是一個(gè)網(wǎng)格,循環(huán)過(guò)程就像是在每個(gè)網(wǎng)格里遍歷、搜索,所以叫g(shù)rid search。
問(wèn)題 11 - 交叉驗(yàn)證什么是K折交叉驗(yàn)證法(k-fold cross-validation)?
GridSearchCV 是如何結(jié)合交叉驗(yàn)證來(lái)完成對(duì)最佳參數(shù)組合的選擇的?
GridSearchCV 中的"cv_results_"屬性能告訴我們什么?
網(wǎng)格搜索為什么要使用K折交叉驗(yàn)證?K折交叉驗(yàn)證能夠避免什么問(wèn)題?
提示:在解釋k-fold交叉驗(yàn)證時(shí),一定要理解"k"是什么,和數(shù)據(jù)集是如何分成不同的部分來(lái)進(jìn)行訓(xùn)練和測(cè)試的,以及基于"k"值運(yùn)行的次數(shù)。
在考慮k-fold交叉驗(yàn)證如何幫助網(wǎng)格搜索時(shí),你可以使用特定的數(shù)據(jù)子集來(lái)進(jìn)行訓(xùn)練與測(cè)試有什么缺點(diǎn),以及K折交叉驗(yàn)證是如何幫助緩解這個(gè)問(wèn)題。
問(wèn)題 11 - 回答:
K折交叉驗(yàn)證是隨機(jī)將訓(xùn)練集劃分成K份,依次將其中的一份作為驗(yàn)證集,其余的K-1份作為訓(xùn)練集,得到K個(gè)模型,觀察每個(gè)模型的表現(xiàn),選擇模型表現(xiàn)最好的那一個(gè),K折交叉驗(yàn)證能夠有效的防止過(guò)擬合;
GridSearchCV通過(guò)交叉驗(yàn)證得到每個(gè)參數(shù)組合的得分,以此確定最優(yōu)的參數(shù)組合;
GridSearchCV 中的cv_results 屬性返回一個(gè)字典,記錄了每一組網(wǎng)格參數(shù)每一次訓(xùn)練/驗(yàn)證( K 折對(duì)應(yīng) K 次)對(duì)應(yīng)的訓(xùn)練結(jié)果,包括訓(xùn)練/驗(yàn)證時(shí)間、訓(xùn)練/驗(yàn)證評(píng)估分?jǐn)?shù)以及相關(guān)時(shí)間和評(píng)分的統(tǒng)計(jì)信息;
采用交叉驗(yàn)證可以使得網(wǎng)格搜索的結(jié)果可信度更高,對(duì)網(wǎng)格搜索來(lái)說(shuō),可以將訓(xùn)練數(shù)據(jù)可以按一定比例分為訓(xùn)練集和驗(yàn)證集,而不使用交叉驗(yàn)證,但是這樣做的話,網(wǎng)格搜索的結(jié)果依賴(lài)于訓(xùn)練集和驗(yàn)證集的劃分,這樣的劃分不具有代表性。采用K折交叉驗(yàn)證取平均值可以避免樣本劃分不合理的情況,使得結(jié)果可信度更高。
編程練習(xí) 7:訓(xùn)練最優(yōu)模型在這個(gè)練習(xí)中,你將需要將所學(xué)到的內(nèi)容整合,使用決策樹(shù)算法訓(xùn)練一個(gè)模型。為了得出的是一個(gè)最優(yōu)模型,你需要使用網(wǎng)格搜索法訓(xùn)練模型,以找到最佳的 "max_depth" 參數(shù)。你可以把"max_depth" 參數(shù)理解為決策樹(shù)算法在做出預(yù)測(cè)前,允許其對(duì)數(shù)據(jù)提出問(wèn)題的數(shù)量。決策樹(shù)是監(jiān)督學(xué)習(xí)算法中的一種。
在下方 fit_model 函數(shù)中,你需要做的是:
定義 "cross_validator" 變量: 使用 sklearn.model_selection 中的 KFold 創(chuàng)建一個(gè)交叉驗(yàn)證生成器對(duì)象;
定義 "regressor" 變量: 使用 sklearn.tree 中的 DecisionTreeRegressor 創(chuàng)建一個(gè)決策樹(shù)的回歸函數(shù);
定義 "params" 變量: 為 "max_depth" 參數(shù)創(chuàng)造一個(gè)字典,它的值是從1至10的數(shù)組;
定義 "scoring_fnc" 變量: 使用 sklearn.metrics 中的 make_scorer 創(chuàng)建一個(gè)評(píng)分函數(shù);
將 ‘performance_metric’ 作為參數(shù)傳至這個(gè)函數(shù)中;
定義 "grid" 變量: 使用 sklearn.model_selection 中的 GridSearchCV 創(chuàng)建一個(gè)網(wǎng)格搜索對(duì)象;將變量"regressor", "params", "scoring_fnc"和 "cross_validator" 作為參數(shù)傳至這個(gè)對(duì)象構(gòu)造函數(shù)中;
如果你對(duì)python函數(shù)的默認(rèn)參數(shù)定義和傳遞不熟悉,可以參考這個(gè)MIT課程的視頻。
# TODO: Import "make_scorer", "DecisionTreeRegressor", and "GridSearchCV" from sklearn.model_selection import KFold from sklearn.tree import DecisionTreeRegressor from sklearn.metrics import make_scorer from sklearn.model_selection import GridSearchCV def 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) # TODO: Create a decision tree regressor object regressor = DecisionTreeRegressor(random_state=1) # TODO: Create a dictionary for the parameter "max_depth" with a range from 1 to 10 params = {"max_depth":[i for i in range(1, 11)]} # TODO: Transform "performance_metric" into a scoring function using "make_scorer" scoring_fnc = make_scorer(performance_metric) # TODO: 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 model grid = grid.fit(X, y) # Return the optimal model after fitting the data return grid.best_estimator_第六步. 做出預(yù)測(cè)
當(dāng)我們用數(shù)據(jù)訓(xùn)練出一個(gè)模型,它就可用于對(duì)新的數(shù)據(jù)進(jìn)行預(yù)測(cè)。在我們的例子--決策樹(shù)回歸函數(shù)中,模型已經(jīng)學(xué)會(huì)對(duì)新輸入的數(shù)據(jù)“提問(wèn)”,并返回對(duì)目標(biāo)變量的預(yù)測(cè)值。你可以用這些預(yù)測(cè)來(lái)獲取未知目標(biāo)變量的數(shù)據(jù)的信息,但是,輸入的新數(shù)據(jù)必須不能是已有訓(xùn)練數(shù)據(jù)之中的。
問(wèn)題 12 - 最優(yōu)模型最優(yōu)模型的最大深度(maximum depth)是多少?此答案與你在問(wèn)題 9所做的猜測(cè)是否相同?
運(yùn)行下方區(qū)域內(nèi)的代碼,將決策樹(shù)回歸函數(shù)代入訓(xùn)練數(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 5 for the optimal model.
最終,使用我們確認(rèn)好的參數(shù)來(lái)對(duì)測(cè)試數(shù)據(jù)進(jìn)行預(yù)測(cè),完成下面的問(wèn)題,來(lái)看看我們的訓(xùn)練結(jié)果如何吧
問(wèn)題12.1:填入上題所確認(rèn)的最優(yōu)參數(shù),查看測(cè)試結(jié)果
depth = 5 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.7520883029841192
問(wèn)題12.2:你剛剛計(jì)算了最優(yōu)模型在測(cè)試集上的決定系數(shù),你會(huì)如何評(píng)價(jià)這個(gè)結(jié)果?還有什么地方可以改進(jìn),以提升這一分?jǐn)?shù)呢?
回答問(wèn)題12.2:這個(gè)結(jié)果并不是理想的,應(yīng)該還需要利用決策樹(shù)的其他參數(shù)進(jìn)行網(wǎng)格搜索,以及使用更多的特征;
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/43494.html
摘要:十三套框架助你玩轉(zhuǎn)機(jī)器學(xué)習(xí)技術(shù)在今天的文章中,我們將共同了解十三款機(jī)器學(xué)習(xí)框架,一部分去年剛剛發(fā)布另一部分則在不久前進(jìn)行了全部升級(jí)。目前該項(xiàng)目正積極添加對(duì)的支持能力,不過(guò)此類(lèi)項(xiàng)目一般更傾向于直接面向各承載機(jī)器學(xué)習(xí)任務(wù)的主流環(huán)境。 導(dǎo)讀過(guò)去幾年以來(lái),機(jī)器學(xué)習(xí)已經(jīng)開(kāi)始以前所未有的方式步入主流層面。這種趨勢(shì)并非單純由低成本云環(huán)境乃至極為強(qiáng)大的GPU硬件所推動(dòng); 除此之外,面向機(jī)器學(xué)習(xí)的可用框架也迎...
摘要:普通程序員,如何轉(zhuǎn)向人工智能方向,是知乎上的一個(gè)問(wèn)題。領(lǐng)域簡(jiǎn)介,也就是人工智能,并不僅僅包括機(jī)器學(xué)習(xí)。但是,人工智能并不等同于機(jī)器學(xué)習(xí),這點(diǎn)在進(jìn)入這個(gè)領(lǐng)域時(shí)一定要認(rèn)識(shí)清楚。 人工智能已經(jīng)成為越來(lái)越火的一個(gè)方向。普通程序員,如何轉(zhuǎn)向人工智能方向,是知乎上的一個(gè)問(wèn)題。本文是對(duì)此問(wèn)題的一個(gè)回答的歸檔版。相比原回答有所內(nèi)容增加。 目的 本文的目的是給出一個(gè)簡(jiǎn)單的,平滑的,易于實(shí)現(xiàn)的學(xué)習(xí)方法,幫...
閱讀 545·2019-08-30 15:55
閱讀 956·2019-08-29 15:35
閱讀 1211·2019-08-29 13:48
閱讀 1923·2019-08-26 13:29
閱讀 2948·2019-08-23 18:26
閱讀 1261·2019-08-23 18:20
閱讀 2843·2019-08-23 16:43
閱讀 2718·2019-08-23 15:58