【火爐煉AI】機器學(xué)習(xí)012-用隨機森林構(gòu)建汽車評估模型及模型的優(yōu)化提升方法

【火爐煉AI】機器學(xué)習(xí)012-用隨機森林構(gòu)建汽車評估模型及模型的優(yōu)化提升方法

(本文所使用的Python庫和版本號: Python 3.5, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )

在前面的文章中(【火爐煉AI】機器學(xué)習(xí)007-用隨機森林構(gòu)建共享單車需求預(yù)測模型 )已經(jīng)介紹了用隨機森林方法構(gòu)建共享單車需求預(yù)測模型允睹,在代碼實現(xiàn)層面上來講部脚,構(gòu)建隨機森林模型非常簡單底桂。

下面我們同樣使用隨機森林算法構(gòu)建汽車評估模型域携,用于根據(jù)汽車的六個基本特性來評估汽車的質(zhì)量关顷。


1. 準備數(shù)據(jù)集

本項目所使用的數(shù)據(jù)集來源于加利福尼亞大學(xué)歐文分校(UCI)大學(xué)的公開數(shù)據(jù)集:https://archive.ics.uci.edu/ml/datasets/Car+Evaluation餐济。這是專門用于解決多分類問題的一個小型數(shù)據(jù)集侨赡,該數(shù)據(jù)集的基本信息為:

image

即整個數(shù)據(jù)集專門用于多分類模型,沒有缺失值勋锤,一共有1728個樣本饭玲,每個樣本含有6個關(guān)于汽車的基本屬性,每個樣本對應(yīng)于一個標(biāo)記叁执,表示汽車質(zhì)量的好壞茄厘,如下所示:

image

在對數(shù)據(jù)集有了基本了解的基礎(chǔ)上,可以用代碼來具體分析谈宛,此處我用pandas來提取數(shù)據(jù)集中的原始數(shù)據(jù)次哈,代碼如下:

# 準備數(shù)據(jù)集
dataset_path='D:\PyProjects\DataSet\CarEvaluation/car.data'
df=pd.read_csv(dataset_path,header=None)
print(df.info()) # 加載沒有問題
# 原數(shù)據(jù)集包含有1728個樣本,每一個樣本含有6個features, 一個label
print(df.head())
raw_set=df.values

-------------------------------------輸---------出--------------------------------

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1728 entries, 0 to 1727
Data columns (total 7 columns):
0 1728 non-null object
1 1728 non-null object
2 1728 non-null object
3 1728 non-null object
4 1728 non-null object
5 1728 non-null object
6 1728 non-null object
dtypes: object(7)
memory usage: 94.6+ KB
None
0 1 2 3 4 5 6
0 vhigh vhigh 2 2 small low unacc
1 vhigh vhigh 2 2 small med unacc
2 vhigh vhigh 2 2 small high unacc
3 vhigh vhigh 2 2 med low unacc
4 vhigh vhigh 2 2 med med unacc

--------------------------------------------完-------------------------------------

通過df.info()可以看出該數(shù)據(jù)集的7列都是object類型入挣,故而難以直接應(yīng)用到機器學(xué)習(xí)領(lǐng)域亿乳,需要做進一步的類型轉(zhuǎn)換處理,如下代碼:

# 數(shù)據(jù)集中的特征向量包括有多個String径筏,故而type是object,需要轉(zhuǎn)換為數(shù)值
from sklearn import preprocessing
label_encoder=[] # 放置每一列的encoder
encoded_set = np.empty(raw_set.shape)
for i,_ in enumerate(raw_set[0]):
#     encoder=preprocessing.LabelEncoder()
#     encoder.fit(raw_set[:,i]) # 用某一列來fit這個encoder
#     encoded_set[:,i]=encoder.transform(raw_set[:,i]) # 用同樣的這一列來transform
#     label_encoder.append(encoder)
    
    # 上面fit和tranform都是在同一個向量上操作障陶,故而可以整合
    encoder=preprocessing.LabelEncoder()
    encoded_set[:,i]=encoder.fit_transform(raw_set[:,i])
    print(encoder.classes_)
    label_encoder.append(encoder)

dataset_X = encoded_set[:, :-1].astype(int)
dataset_y = encoded_set[:, -1].astype(int)
# print(dataset_X.shape) # (1728, 6)
# print(dataset_y.shape) #(1728,)
print(dataset_X[:5]) # 可以看出每個特征向量都將string轉(zhuǎn)變?yōu)閕nt
print(dataset_y[:5]) # 檢查沒有問題

# 將數(shù)據(jù)集拆分為train set 和test set
from sklearn.model_selection import train_test_split
train_X, test_X, train_y, test_y=train_test_split(dataset_X,dataset_y,
                                                  test_size=0.3,random_state=42)
# print(train_X.shape) # (1209, 6)
# print(train_y.shape) # (1209,)
# print(test_X.shape) # (519, 6) 

-------------------------------------輸---------出--------------------------------

['high' 'low' 'med' 'vhigh']
['high' 'low' 'med' 'vhigh']
['2' '3' '4' '5more']
['2' '4' 'more']
['big' 'med' 'small']
['high' 'low' 'med']
['acc' 'good' 'unacc' 'vgood']
[[3 3 0 0 2 1]
[3 3 0 0 2 2]
[3 3 0 0 2 0]
[3 3 0 0 1 1]
[3 3 0 0 1 2]]
[2 2 2 2 2]

--------------------------------------------完-------------------------------------

可以看出轉(zhuǎn)換之后的數(shù)據(jù)集都是int型滋恬,故而可以輸入到模型中進行訓(xùn)練和預(yù)測。同時抱究,為了訓(xùn)練和測試的方便恢氯,將整個數(shù)據(jù)集劃分為訓(xùn)練集(占比70%,即1209個樣本)和測試集(占比30%,即519個樣本)勋拟。

########################小**********結(jié)###############################

1勋磕,由于本次數(shù)據(jù)集的屬性和標(biāo)記都是string類型,故而需要先轉(zhuǎn)變?yōu)閿?shù)值型敢靡。轉(zhuǎn)變是通過LabelEncoder()函數(shù)完成的挂滓。

2,這里使用的轉(zhuǎn)變器(即LabelEncoder()實例)需要保存啸胧,便于以后對新樣本屬性進行轉(zhuǎn)換赶站,或者對預(yù)測出來的標(biāo)記再反向轉(zhuǎn)變成string,此處將其保存到label_encoder這個list中纺念。

#################################################################


2. 構(gòu)建隨機森林分類模型和模型評估

2.1 隨機森林分類模型的構(gòu)建

隨機森林分類模型的構(gòu)建非常簡單贝椿,可以參考【火爐煉AI】機器學(xué)習(xí)007-用隨機森林構(gòu)建共享單車需求預(yù)測模型 。如下代碼先構(gòu)建一個隨機森林分類器陷谱,然后用訓(xùn)練集來訓(xùn)練該分類器烙博,最后用測試集來檢查模型的好壞,打印出模型評價指標(biāo)烟逊。關(guān)于模型評價指標(biāo)的具體含義和計算方法习勤,可以參考【火爐煉AI】機器學(xué)習(xí)011-分類模型的評估:準確率,精確率焙格,召回率图毕,F(xiàn)1值

# 建立隨機森林分類器
from sklearn.ensemble import RandomForestClassifier
rf_classifier=RandomForestClassifier(n_estimators=200,max_depth=8,random_state=37)
rf_classifier.fit(train_X,train_y) # 用訓(xùn)練集進行訓(xùn)練

# 用測試集評估模型的準確率眷唉,精確率予颤,召回率,F(xiàn)1值:
def print_model_evaluations(classifier,test_X, test_y,cv=5):
    '''print evaluation indicators of classifier on test_set.
    those indicators include: accuracy, precision, recall F1-measure'''
    from sklearn.cross_validation import cross_val_score
    accuracy=cross_val_score(classifier,test_X,test_y,
                             scoring='accuracy',cv=cv)
    print('準確率:{:.2f}%'.format(accuracy.mean()*100))
    precision=cross_val_score(classifier,test_X,test_y,
                             scoring='precision_weighted',cv=cv)
    print('精確度:{:.2f}%'.format(precision.mean()*100))
    recall=cross_val_score(classifier,test_X,test_y,
                             scoring='recall_weighted',cv=cv)
    print('召回率:{:.2f}%'.format(recall.mean()*100))
    f1=cross_val_score(classifier,test_X,test_y,
                             scoring='f1_weighted',cv=cv)
    print('F1  值:{:.2f}%'.format(f1.mean()*100))

print_model_evaluations(rf_classifier,test_X,test_y)    

-------------------------------------輸---------出--------------------------------

準確率:89.19%
精確度:88.49%
召回率:89.19%
F1 值:88.32%

--------------------------------------------完-------------------------------------

2.2 隨機森林分類模型的全面評估

更進一步的冬阳,為了更全面的評估該模型蛤虐,可以將模型在測試集上的混淆矩陣和分類報告打印出來,關(guān)于混淆矩陣和分類報告肝陪,可以參考【火爐煉AI】機器學(xué)習(xí)011-分類模型的評估:準確率驳庭,精確率,召回率氯窍,F(xiàn)1值 饲常。如下所示:

# 打印模型的混淆矩陣和各個類別的評價指標(biāo)
# 使用sklearn 模塊計算混淆矩陣
from sklearn.metrics import confusion_matrix
test_y_pred=rf_classifier.predict(test_X)
confusion_mat = confusion_matrix(test_y, test_y_pred)
print(confusion_mat) #看看混淆矩陣長啥樣
print('*'*50)
from sklearn.metrics import classification_report
print(classification_report(test_y, test_y_pred))

-------------------------------------輸---------出--------------------------------

[[108 2 7 1]
[ 9 8 0 2]
[ 3 0 355 0]
[ 3 0 0 21]]

precision recall f1-score support

0 0.88 0.92 0.90 118
1 0.80 0.42 0.55 19
2 0.98 0.99 0.99 358
3 0.88 0.88 0.88 24

avg / total 0.95 0.95 0.94 519

--------------------------------------------完-------------------------------------

從上面的分類報告中可以看出,這個模型在類別2上表現(xiàn)最好狼讨,精確率和召回率均在98%以上贝淤,但在類別1,雖然精確率有80%政供,但召回率卻低至42%播聪,所得到的F1值也只有55%朽基,表明這個模型還有進一步優(yōu)化的空間(出現(xiàn)這種結(jié)果也有可能是test set中類別2的樣本數(shù)最多,而類別1的樣本數(shù)最少導(dǎo)致的)离陶。

2.3 用該分類模型預(yù)測新樣本數(shù)據(jù)

一個模型經(jīng)過訓(xùn)練和優(yōu)化之后稼虎,一旦達到了我們的分類要求,就可以用來預(yù)測新樣本數(shù)據(jù)招刨,如下我們自己構(gòu)建了一個新的汽車樣本霎俩,這個樣本汽車的購買價格和維護價格都非常高,有2個車門计济,載人數(shù)2人茸苇,后備箱比較小,安全性比較低(很有可能是那種2座的豪華車吧沦寂。学密。。)传藏∧迥海看看這個分類模型對這種車的質(zhì)量評估怎么樣。

# 看起來該隨機森林分類器的分類效果還是很不錯的毯侦,
# 那么可以用這個比較理想的模型來預(yù)測新數(shù)據(jù)哭靖,
new_sample=['vhigh','vhigh','2','2','small','low']
# 在把這個樣本輸入模型之前,需要將樣本中的string轉(zhuǎn)變?yōu)閕nt
# 采用和上面train set相同的encoder來編碼
encoded_sample=np.empty(np.array(new_sample).shape)
for i,item in enumerate(new_sample):
    encoded_sample[i]=int(label_encoder[i].transform([item])) 
    # 這兒的item一定要加【】,否則報錯侈离。而且要轉(zhuǎn)變?yōu)閕nt類型
print(encoded_sample.reshape(1,-1)) # 和上面打印的print(encoder.classes_)對應(yīng)一致

# 用成熟分類模型對該新樣本進行分類试幽,得到分類結(jié)果:
output=rf_classifier.predict(encoded_sample.reshape(1,-1))
print('output: {}, class: {}'.format(output,
       label_encoder[-1].inverse_transform(output)[0]))

-------------------------------------輸---------出--------------------------------

[[3. 3. 0. 0. 2. 1.]]
output: [2], class: unacc

--------------------------------------------完-------------------------------------

在將新樣本數(shù)據(jù)輸入模型之前,需要對樣本數(shù)據(jù)進行轉(zhuǎn)換(即對特征向量進行編碼卦碾,將人可以閱讀的字符串轉(zhuǎn)變?yōu)闄C器可以閱讀的數(shù)值)铺坞,注意此時的轉(zhuǎn)換要用到和前面訓(xùn)練集相同的轉(zhuǎn)換方法,即使用前面放置到label_encoder這個list中的encoder來轉(zhuǎn)換洲胖,可以將轉(zhuǎn)換之后的數(shù)值打印出來進行驗證济榨。分類模型根據(jù)該樣本的六個屬性,判斷出該汽車的質(zhì)量為2绿映,此時我們需要將2再反向轉(zhuǎn)換為字符串(即反編碼擒滑,或解碼,即將機器可以閱讀的數(shù)值轉(zhuǎn)變?yōu)槿丝梢蚤喿x的字符串)叉弦,經(jīng)過解碼后丐一,發(fā)現(xiàn)該汽車的質(zhì)量為“unacc”,即unacceptable卸奉。

可以想象一下钝诚,一輛價格老貴老貴,維護起來也老貴老貴榄棵,后備箱又小凝颇,只能坐兩個人,而且安全性還非常低的汽車疹鳄,你能接收嗎拧略??瘪弓?屌絲沒錢不能接受垫蛆,土豪雖然可以用這種車來泡妞,但是安全性太低腺怯,土豪也接收不了吧袱饭。。呛占。

########################小**********結(jié)###############################

1虑乖,隨機森林分類模型的構(gòu)建非常簡單,直接調(diào)用sklearn模塊中的RandomForestClassifier 類即可晾虑。

2疹味,對分類模型的評估可以直接打印其整體的準確率,精確率帜篇,召回率糙捺,F(xiàn)1值,也可以打印該模型在各個不同類別上的評價指標(biāo)笙隙,打印其混淆矩陣和分類報告洪灯。

#################################################################


3. 模型的優(yōu)化提升方法

上面的分類模型貌似在測試集上的表現(xiàn)還不錯,但是還有提升空間竟痰,主要有以下兩個方面的優(yōu)化提升签钩。

3.1 模型超參數(shù)的優(yōu)化—驗證曲線

前面在定義隨機森林分類器時,我們隨機地定義該分類器的參數(shù)為:n_estimators=200,max_depth=8凯亮,但是這些隨機定義的參數(shù)真的是最優(yōu)參數(shù)組合嗎边臼?怎么獲取這些參數(shù)的最優(yōu)值了?這就是驗證曲線的作用了假消。下面首先優(yōu)化n_estimators參數(shù)柠并,看看取不同值時,該模型的準確率是否有明確的改善富拗。

如下代碼臼予,使用sklearn中的validation_curve可以驗證不同參數(shù)取值時模型的準確率。

# 提升模型的分類效果:優(yōu)化模型的某個參數(shù)啃沪,
# 第一步:優(yōu)化n_estimators參數(shù)
from sklearn.model_selection import validation_curve
optimize_classifier1=RandomForestClassifier(max_depth=4,random_state=37)
parameter_grid=np.linspace(20,400,20).astype(int)
train_scores,valid_scores=validation_curve(optimize_classifier1,train_X,train_y,
                                           'n_estimators',parameter_grid,cv=5) 
# cv=4粘拾,會輸出4列結(jié)果,cv=5创千,會輸出5列結(jié)果缰雇,
# 故而輸出的結(jié)果train_scores 的shape為(parameter_grid.shape[0],cv)

# 打印優(yōu)化結(jié)果
print('n_estimators optimization results-------->>>')
print('train scores: \n ',train_scores)
print('-'*80)
print('valid scores: \n ',valid_scores)

-------------------------------------輸---------出--------------------------------

n_estimators optimization results-------->>>
train scores:
[[0.78549223 0.80144778 0.80785124 0.79338843 0.80165289]
[0.8 0.80972079 0.81095041 0.81921488 0.83057851]
[0.8134715 0.81075491 0.81095041 0.81404959 0.81714876]

......

valid scores:
[[0.77459016 0.79338843 0.80082988 0.76763485 0.80497925]
[0.79918033 0.79338843 0.80497925 0.80082988 0.8340249 ]
[0.81967213 0.80578512 0.80082988 0.78008299 0.82572614]
[0.79918033 0.80991736 0.7966805 0.78838174 0.82572614]

......

--------------------------------------------完-------------------------------------

得到的trains_scores和valid_scores矩陣很大入偷,此處只顯示一部分,可以在本文末尾我的github中找到原始代碼和結(jié)果械哟。雖然此處得到了驗證曲線的結(jié)果疏之,但是難以直接觀察結(jié)果的好壞,故而我自己定義一個繪圖函數(shù)暇咆,將驗證曲線的結(jié)果繪制成圖锋爪,代碼如下:

# 定義一個繪圖函數(shù),繪制train scores 和valid scores
def plot_valid_curve(grid_arr,train_scores,valid_scores,
                     title=None,x_label=None,y_label=None):
    '''plot train_scores and valid_scores into a line graph'''
    assert train_scores.shape==valid_scores.shape, \
        'expect train_scores and valid_scores have same shape'
    assert grid_arr.shape[0]==train_scores.shape[0], \
        'expect grid_arr has the same first dim with train_scores'
    plt.figure()
    plt.plot(grid_arr, 100*np.average(train_scores, axis=1), 
             color='blue',marker='v',label='train_scores')
    plt.plot(grid_arr, 100*np.average(valid_scores, axis=1), 
             color='red',marker='s',label='valid_scores')
    plt.title(title) if title is not None else None
    plt.xlabel(x_label) if x_label is not None else None
    plt.ylabel(y_label) if y_label is not None else None
    plt.legend()
    plt.show()

plot_valid_curve(parameter_grid,train_scores,valid_scores,
                 title='n_estimators optimization graph',
                 x_label='Num of estimators',y_label='Accuracy%')
優(yōu)化n_estimators的結(jié)果圖

上圖中可以看出爸业,在estimators取值為50附近時其骄,能夠得到最高的準確率,故而我們可以進一步優(yōu)化estimators在50附近的取值扯旷。如下代碼:

# 第二步:對n_estimators做進一步細致優(yōu)化
# 圖中可以看出拯爽,n_estimators在100以內(nèi)所得到的準確率最高,故而需要進一步做更精細的優(yōu)化
parameter_grid2=np.linspace(20,120,20).astype(int)
train_scores,valid_scores=validation_curve(optimize_classifier1,train_X,train_y,
                                           'n_estimators',parameter_grid2,cv=5) 
plot_valid_curve(parameter_grid2,train_scores,valid_scores,
                 title='2nd n_estimators optimization graph',
                 x_label='Num of estimators',y_label='Accuracy%')
# 從圖中可以看出準確率最高的點是第6,7薄霜,12附近某抓,對應(yīng)的estimators是46,51,77,
# 故而后面暫定為50
精細化優(yōu)化n_estimators的結(jié)果圖

從上圖中可以看出惰瓜,準確率的最高點對應(yīng)的estimators大約為46,51,77否副,故而我們確定最優(yōu)的estimators參數(shù)的取值為50.

對于max_depth,可以采用同樣的驗證曲線來優(yōu)化崎坊,得到最優(yōu)值备禀,如下代碼和圖:

# 第三步:對max_depth進行優(yōu)化:
optimize_classifier2=RandomForestClassifier(n_estimators=50,random_state=37)
parameter_grid3=np.linspace(2,13,11).astype(int)
print(parameter_grid3) # [ 2  3  4  5  6  7  8  9 10 11 13]
train_scores3,valid_scores3=validation_curve(optimize_classifier2,train_X,train_y,
                                           'max_depth',parameter_grid3,cv=5) 
plot_valid_curve(parameter_grid3,train_scores3,valid_scores3,
                 title='max_depth optimization graph',
                 x_label='Num of max_depth',y_label='Accuracy%')
# 從圖中可以看出,取max_depth=10奈揍,11,13時準確率一樣曲尸,故而取max_depth=10
對max_depth優(yōu)化后的結(jié)果

從上圖中可以看出,準確率的最高點對應(yīng)的max_depth大約為10,11,13男翰,這幾個點處的結(jié)果幾乎一樣另患,故而我們確定最優(yōu)的max_depth參數(shù)的取值為10.

3.2 訓(xùn)練集大小對模型的影響—學(xué)習(xí)曲線

前面我們通過驗證曲線優(yōu)化了模型中各種參數(shù),得到了參數(shù)的最佳取值蛾绎,但有的時候昆箕,訓(xùn)練集的大小也會對模型的效果有影響,此時我們可以用學(xué)習(xí)曲線來判斷最佳的訓(xùn)練集大小租冠。代碼如下:

# 前面都是優(yōu)化隨機森林分類器的內(nèi)置參數(shù)鹏倘,但是沒有考慮訓(xùn)練集的大小對模型效果的影響
# 前面都是用traiin_X來優(yōu)化模型,train_X含有1209個樣本顽爹,
# 下面考察一下訓(xùn)練集樣本大小對模型效果的影響--即學(xué)習(xí)曲線
from sklearn.model_selection import learning_curve
# optimize_classifier3=RandomForestClassifier(random_state=37)
optimize_classifier3=RandomForestClassifier(n_estimators=50,
                                            max_depth=10,
                                            random_state=37)
parameter_grid4=np.array([0.1,0.2,0.3,0.4,0.5,0.6,0.7,.8,.9,1.]) # dataset最多有1728個樣本
train_sizes,train_scores4,valid_scores4=learning_curve(optimize_classifier3,
                                                       dataset_X,dataset_y,
                                          train_sizes=parameter_grid4,cv=5) 
# print(train_sizes) # [ 138  276  414  552  691  829  967 1105 1243 1382]
# 最大也只能到dataset_X樣本數(shù)的80%纤泵,即1728*0.8=1382
plot_valid_curve(parameter_grid4,train_scores4,valid_scores4,
                 title='train_size optimization graph',
                 x_label='Num of train_size',y_label='Accuracy%')
# 可以看出,在train_size=1382時得到的準確率最大镜粤,約為80%左右捏题。
訓(xùn)練集大小對準確率的影響

可以從圖中看出玻褪,訓(xùn)練集大小貌似越大越好,因為訓(xùn)練集越大涉馅,模型訓(xùn)練的越充分归园,得到的valid_scores與train_scores的差距越小黄虱,這里的差距實際上就是“過擬合”現(xiàn)象稚矿。而此處通過提高訓(xùn)練集的大小,可以減小過擬合現(xiàn)象捻浦。

還有一點晤揣,learning_curve里面貌似把最大取值固定為整個數(shù)據(jù)集的80%,這個能修改嗎朱灿?

3.3 用最優(yōu)參數(shù)重新建立模型昧识,判斷模型的質(zhì)量

前面我們花了好長時間來優(yōu)化模型,得到了最佳超參數(shù)和最佳訓(xùn)練集大小盗扒,那么跪楞,如果用這些參數(shù)來訓(xùn)練模型,得到模型的質(zhì)量會怎么樣了侣灶?非常好還是非常差甸祭?如下直接上代碼。

# 用所有最優(yōu)參數(shù)來重新構(gòu)建模型褥影,并判斷此模型的好壞
train_X, test_X, train_y, test_y=train_test_split(dataset_X,dataset_y,
                                                  test_size=0.2,random_state=42)
# 最佳訓(xùn)練集大小為80%

rf_classifier=RandomForestClassifier(n_estimators=50,max_depth=10,random_state=37)
rf_classifier.fit(train_X,train_y) # 用訓(xùn)練集進行訓(xùn)練
print_model_evaluations(rf_classifier,test_X,test_y)    
test_y_pred=rf_classifier.predict(test_X)
confusion_mat = confusion_matrix(test_y, test_y_pred)
print('confusion_mat: ------->>>>>')
print(confusion_mat) #看看混淆矩陣長啥樣
print('*'*50)
print('classification report: -------->>>>>>')
print(classification_report(test_y, test_y_pred))

-------------------------------------輸---------出--------------------------------

準確率:89.32%
精確度:88.49%
召回率:89.32%
F1 值:88.45%
confusion_mat: ------->>>>>
[[ 71 7 5 0]
[ 1 9 0 1]
[ 0 0 235 0]
[ 1 0 0 16]]


classification report: -------->>>>>>
precision recall f1-score support

0 0.97 0.86 0.91 83
1 0.56 0.82 0.67 11
2 0.98 1.00 0.99 235
3 0.94 0.94 0.94 17

avg / total 0.96 0.96 0.96 346

--------------------------------------------完-------------------------------------

貌似比第一次定義的模型在性能上提高了一點點池户。。凡怎。校焦。


注:本部分代碼已經(jīng)全部上傳到(我的github)上,歡迎下載统倒。

參考資料:

1, Python機器學(xué)習(xí)經(jīng)典實例寨典,Prateek Joshi著,陶俊杰房匆,陳小莉譯

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末耸成,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子坛缕,更是在濱河造成了極大的恐慌墓猎,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赚楚,死亡現(xiàn)場離奇詭異毙沾,居然都是意外死亡,警方通過查閱死者的電腦和手機宠页,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進店門左胞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寇仓,“玉大人,你說我怎么就攤上這事烤宙”榉常” “怎么了?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵躺枕,是天一觀的道長服猪。 經(jīng)常有香客問我,道長拐云,這世上最難降的妖魔是什么罢猪? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮叉瘩,結(jié)果婚禮上膳帕,老公的妹妹穿的比我還像新娘。我一直安慰自己薇缅,他們只是感情好危彩,可當(dāng)我...
    茶點故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著泳桦,像睡著了一般汤徽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蓬痒,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天泻骤,我揣著相機與錄音,去河邊找鬼梧奢。 笑死狱掂,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的亲轨。 我是一名探鬼主播趋惨,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼惦蚊!你這毒婦竟也來了器虾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤蹦锋,失蹤者是張志新(化名)和其女友劉穎兆沙,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體莉掂,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡葛圃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片库正。...
    茶點故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡曲楚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出褥符,到底是詐尸還是另有隱情龙誊,我是刑警寧澤,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布喷楣,位于F島的核電站趟大,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏抡蛙。R本人自食惡果不足惜护昧,卻給世界環(huán)境...
    茶點故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望粗截。 院中可真熱鬧,春花似錦捣炬、人聲如沸熊昌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽婿屹。三九已至,卻和暖如春推溃,著一層夾襖步出監(jiān)牢的瞬間昂利,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工铁坎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蜂奸,地道東北人。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓硬萍,卻偏偏與公主長得像扩所,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子朴乖,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,566評論 2 349

推薦閱讀更多精彩內(nèi)容