国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

機(jī)器學(xué)習(xí)實(shí)驗(yàn)——使用決策樹和隨機(jī)森林對(duì)數(shù)據(jù)分類

這篇具有很好參考價(jià)值的文章主要介紹了機(jī)器學(xué)習(xí)實(shí)驗(yàn)——使用決策樹和隨機(jī)森林對(duì)數(shù)據(jù)分類。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

實(shí)驗(yàn)要求:

使用決策樹算法和隨機(jī)森林算法對(duì)income_classification.csv的收入水平進(jìn)行分類。訓(xùn)練集和測(cè)試集的比例是7:3,選取適當(dāng)?shù)奶卣髁?,使得針?duì)測(cè)試樣本的分類準(zhǔn)確率在80%以上,比較2種分類方法的準(zhǔn)確率。

數(shù)據(jù)說明:

特征列:

age:年齡,整數(shù)

workclass:工作性質(zhì),字符串

education:教育程度,字符串

education_num:受教育年限,整數(shù)

maritial_status:婚姻狀況,字符串

occupation:職業(yè),字符串

relationship:親戚關(guān)系,字符串

race:種族,字符串

sex:性別,字符串

capital_gain:資本收益,浮點(diǎn)數(shù)

capital_loss:資本損失,浮點(diǎn)數(shù)

hours_per_week:每周工作小時(shí)數(shù),浮點(diǎn)數(shù)

native_country:原籍,字符串

分類標(biāo)簽列:income

imcome > 50K

Imcome ≤ 50K

1、讀入數(shù)據(jù)并顯示數(shù)據(jù)的維度和前5行數(shù)據(jù)

2、對(duì)連續(xù)變量年齡進(jìn)行離散化,并顯示前5行數(shù)據(jù)離散化后的結(jié)果

age_bins = [20, 30,40, 50, 60, 70]

3、對(duì)屬性是字符串的任意特征進(jìn)行數(shù)字編號(hào)處理,顯示前5行編號(hào)后的結(jié)果,每個(gè)特定的字符串用一個(gè)整數(shù)來表示,整數(shù)序列從0開始增長(zhǎng)。

4、對(duì)預(yù)處理后的數(shù)據(jù)用決策樹算法和隨機(jī)森林算法分類

實(shí)驗(yàn)步驟

  1. 選擇合適的若干特征字段

  2. 按7:3劃分訓(xùn)練集和樣本集

  3. 使用訓(xùn)練集訓(xùn)練一個(gè)決策樹分類器

  4. 使用測(cè)試集計(jì)算決策樹分類器的分類準(zhǔn)確率

  5. 使用訓(xùn)練集訓(xùn)練一個(gè)隨機(jī)森林分類器

  6. 使用測(cè)試集計(jì)算隨機(jī)森林分類器的分類準(zhǔn)確率

5、分析實(shí)驗(yàn)結(jié)果

實(shí)驗(yàn)內(nèi)容:

一、實(shí)驗(yàn)數(shù)據(jù)均存放在income_classification.csv,讀出數(shù)據(jù)使用pandas庫的read_csv方法,顯示前5行數(shù)據(jù)可以使用DataFrame.head(n),n是指返回行數(shù)的整數(shù)值,這個(gè)方法的作用是返回對(duì)象的前n行。

代碼:
import pandas

print("1.載入數(shù)據(jù)......")
data_original = pandas.read_csv('income_classificatio.csv', header = 0, names = column_names)
print("前5行數(shù)據(jù)為")
print(data_original.head(5)) # 返回前5行數(shù)據(jù)
print(data_original.shape) # 顯示數(shù)據(jù)維度
結(jié)果:

機(jī)器學(xué)習(xí)實(shí)驗(yàn)——使用決策樹和隨機(jī)森林對(duì)數(shù)據(jù)分類

二、對(duì)數(shù)據(jù)進(jìn)行分箱處理可以使用cut方法進(jìn)行處理,cut方法可以指定分箱的邊界,每個(gè)箱體里面的樣本量不一定相等,比較適合對(duì)年齡進(jìn)行離散化處理,首先將分組依據(jù)的標(biāo)準(zhǔn)輸入,即age_bins,放入?yún)?shù)為bins的參數(shù)中,參數(shù)x為分箱時(shí)輸入的數(shù)據(jù),labels為要返回的標(biāo)簽,但必須和bins的區(qū)間相對(duì)應(yīng)。

代碼:
age_bins = [20, 30, 40, 50, 60, 70]
data_original['age'] = pandas.cut(x = data_original['age'], bins = age_bins, labels = range(0, 5))
print("對(duì)年齡進(jìn)行離散化,顯示前5行結(jié)果:")
print(data_original.head(5))
結(jié)果:

機(jī)器學(xué)習(xí)實(shí)驗(yàn)——使用決策樹和隨機(jī)森林對(duì)數(shù)據(jù)分類

三、轉(zhuǎn)換字符串?dāng)?shù)據(jù)類型使用LabelEncoder().fit_transform方法,由于此次實(shí)驗(yàn)的特征較多,全部列出來會(huì)造成重復(fù)代碼太多,造成冗余,所以便創(chuàng)建列表column_names來儲(chǔ)存特征,遍歷列表對(duì)各個(gè)特征進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換。

代碼:
from sklearn.preprocessing import LabelEncoder

column_names = ['age', 'workclass',  'education', 'education-num', 'marital-status', 'occupation', \
               'relationship', 'race', 'sex', 'capital-gain', 'capital-loss', 'hours-per-week','native-country', 'income']
               
print("轉(zhuǎn)換字符串?dāng)?shù)據(jù)類型......")
for name in column_names:
    data_original[name] = LabelEncoder().fit_transform(data_original[name])
print(data_original.head(5))
結(jié)果:

機(jī)器學(xué)習(xí)實(shí)驗(yàn)——使用決策樹和隨機(jī)森林對(duì)數(shù)據(jù)分類
四、這一問是這個(gè)實(shí)驗(yàn)最最最重要的地方,由于這個(gè)實(shí)驗(yàn)數(shù)據(jù)集有14個(gè)特征,有的特征對(duì)實(shí)驗(yàn)?zāi)P偷挠绊戄^小,如果未經(jīng)處理直接對(duì)所有的特征直接進(jìn)行訓(xùn)練模型,會(huì)造成計(jì)算成本增加,降低速度。所以使用方差濾波法將方差小,對(duì)樣本區(qū)分價(jià)值不高的特征篩選出來并進(jìn)行淘汰,將剩下方差較大的特征存儲(chǔ)到新的列表中,進(jìn)行模型訓(xùn)練。

代碼:
 print("選擇合適的若干特征字段")
 index = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
 labels = column_names.copy()
 for i in range(len(column_names)):
     if numpy.var(data_original[column_names[i]]) < 2:
         labels.remove(column_names[i])
         index.remove(i)
 print(labels)

x = pandas.DataFrame(data_original, columns = labels)
print(x.head(5))
y = data_original[data_original.columns[-1]]
print(y.head(5))

在這里我新建index列表,進(jìn)行存儲(chǔ)特征的索引,如果判斷出某個(gè)特征的方差少于2便將其移除列表,并且將其索引移除索引列表,最后將剩下的特征使用pandas.DataFrame函數(shù)提取出來,columns參數(shù)表示列索引,只需要將列輸入進(jìn)去就可以得到整列的數(shù)據(jù),這也是為什么我們之前創(chuàng)建index列表,它可以使我們更方便地從data_original中提取出經(jīng)過方差濾波之后的數(shù)據(jù)并將其存入到x中,將income作為分類標(biāo)簽存放到y(tǒng)中。

結(jié)果:機(jī)器學(xué)習(xí)實(shí)驗(yàn)——使用決策樹和隨機(jī)森林對(duì)數(shù)據(jù)分類

處理完數(shù)據(jù)之后就需要?jiǎng)澐钟?xùn)練集和測(cè)試集。我們使用train_test_split方法進(jìn)行劃分,x_train x_test y_train y_test 分別為數(shù)據(jù)、標(biāo)簽的訓(xùn)練集和測(cè)試集,test_size參數(shù)表示為樣本占比,題干要求比例為7:3,則test_size我們?cè)O(shè)置為0.3,但是如果test_size是整數(shù)的話就是表示樣本的數(shù)量。

代碼:
print('劃分訓(xùn)練集測(cè)試集...')
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)

五、既然我們已經(jīng)得到了訓(xùn)練集和數(shù)據(jù)集,那么接下來的工作就比較輕松了,使用決策樹以及隨機(jī)森林分別對(duì)訓(xùn)練集處理訓(xùn)練模型,再使用accuracy_score方法計(jì)算出準(zhǔn)確率。

# 決策樹
DT = tree.DecisionTreeClassifier(criterion='gini', max_depth=10, min_samples_split=5)
DT.fit(x_train, y_train)
print('決策樹分類...')
y_pre = DT.predict(x_test)
print('準(zhǔn)確率:', accuracy_score(y_pre, y_test))

# 隨機(jī)森林
RF = RandomForestClassifier(criterion='gini', max_depth=10, min_samples_split=5, n_estimators=20)
RF.fit(x_train, y_train)
print('隨機(jī)森林分類...')
y_pre = RF.predict(x_test)
print('準(zhǔn)確率:', accuracy_score(y_pre, y_test))
結(jié)果:

機(jī)器學(xué)習(xí)實(shí)驗(yàn)——使用決策樹和隨機(jī)森林對(duì)數(shù)據(jù)分類

總代碼:

import pandas
import numpy
from sklearn import tree
from sklearn.preprocessing import LabelEncoder
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

column_names = ['age', 'workclass',  'education', 'education-num', 'marital-status', 'occupation', \
               'relationship', 'race', 'sex', 'capital-gain', 'capital-loss', 'hours-per-week','native-country', 'income']
if __name__ == "__main__":
    #第1問
    print("1.載入數(shù)據(jù)......")
    data_original = pandas.read_csv('income_classificatio.csv', header=0, names=column_names)
    print("前5行數(shù)據(jù)為")
    print(data_original.head(5))
    print(data_original.shape)
    # 第二問
    age_bins = [20, 30, 40, 50, 60, 70]
    data_original['age'] = pandas.cut(data_original['age'], age_bins, labels=range(0, 5))
    print("對(duì)年齡進(jìn)行離散化,顯示前5行結(jié)果:")
    print(data_original.head(5))
    # 第三問
    print("轉(zhuǎn)換字符串?dāng)?shù)據(jù)類型......")
    for name in column_names:
        data_original[name] = LabelEncoder().fit_transform(data_original[name])
    print(data_original.head(5))
    # 第四問
    print("選擇合適的若干特征字段")
    index = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
    labels = column_names.copy()
    for i in range(len(column_names)):
        if numpy.var(data_original[column_names[i]]) < 2:
            labels.remove(column_names[i])
            index.remove(i)
    print(labels)

    x = pandas.DataFrame(data_original, columns = labels)
    print(x.head(5))
    y = data_original[data_original.columns[-1]]
    print(y.head(5))

    print('劃分訓(xùn)練集測(cè)試集...')
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)

    # 決策樹
    DT = tree.DecisionTreeClassifier(criterion='gini', max_depth=10, min_samples_split=5)
    DT.fit(x_train, y_train)
    print('決策樹分類...')
    y_pre = DT.predict(x_test)
    print('準(zhǔn)確率:', accuracy_score(y_pre, y_test))

    # 隨機(jī)森林
    RF = RandomForestClassifier(criterion='gini', max_depth=10, min_samples_split=5, n_estimators=20)
    RF.fit(x_train, y_train)
    print('隨機(jī)森林分類...')
    y_pre = RF.predict(x_test)
    print('準(zhǔn)確率:', accuracy_score(y_pre, y_test))


由于版面原因,實(shí)驗(yàn)結(jié)果就是上面各個(gè)結(jié)果的匯總。

總結(jié):

此次實(shí)驗(yàn)最關(guān)鍵的地方就是對(duì)特征的選擇,以及決策樹以及隨機(jī)森林的理解。如果有對(duì)以上兩種分類算法不了解的同學(xué)可以自己查詢相關(guān)資料。好啦,此次實(shí)驗(yàn)已經(jīng)成功完成。創(chuàng)作不易,看完的小伙伴們給個(gè)贊呦!文章來源地址http://www.zghlxwxcb.cn/news/detail-441735.html

到了這里,關(guān)于機(jī)器學(xué)習(xí)實(shí)驗(yàn)——使用決策樹和隨機(jī)森林對(duì)數(shù)據(jù)分類的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包