成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

機(jī)器學(xué)習(xí)項(xiàng)目:boston_housing

Batkid / 3478人閱讀

摘要:機(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)入編輯模式。

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

在這個(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.


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

這個(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_truey_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_truey_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, 將 featuresprices 的數(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_trainy_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àn)

在項(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...

復(fù)雜度曲線

下列代碼內(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的模型具有最好的泛化能力。


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

在項(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

相關(guān)文章

  • 機(jī)器學(xué)習(xí)的十三套框架

    摘要:十三套框架助你玩轉(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í)的可用框架也迎...

    OpenDigg 評(píng)論0 收藏0
  • 普通程序員,如何轉(zhuǎn)行人工智能?

    摘要:普通程序員,如何轉(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í)方法,幫...

    mingde 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

Batkid

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<