鳶尾花——決策樹

現有鳶尾花數據集iris.data。Iris數據集是常用的分類實驗數據集,由Fisher, 1936收集整理。Iris也稱鳶尾花卉數據集,是一類多重變量分析的數據集。數據集包含150個數據集,分爲3類,每類50個數據,每個數據包含4個屬性。可通過花萼長度(sepal length)、花萼寬度(sepal width)、花瓣長度(petal length)、花瓣寬度(petal width),4個屬性預測鳶尾花卉屬於(Setosa,Versicolour,Virginica)三個種類中的哪一類。

現需要進行如下實驗:

1、使用pandas庫讀取數據集,得到相應矩陣,並進項相應的數據預處理:包括數據標準化與鳶尾花類別編碼等。

2、採用決策樹分類模型(DecisionTreeClassifier)訓練鳶尾花數據集,測試集取30%,訓練集取70%。

3、特徵選擇標準criterion請分別選擇"gini"與“entropy”,在控制檯分別打印出其測試集正確率。請問在iris.data數據及上,選擇不同的特徵選擇標準,結果有無區別?

4、爲了提升模型的泛化能力,請分別使用十折交叉驗證,確定第三小問中兩個決策樹模型的參數max_depth(樹的最大深度,該特徵爲最有效的預剪枝參數)與max_features(劃分時考慮的最大特徵數)的最優取值。max_depth取值範圍爲1-5,max_features的取值範圍爲1-4。請在控制檯輸出這兩個參數的最優取值。

5、分別使用最優取值替換模型的參數設置。

6、爲了更好的反應模型的預測能力,請在所有數據上使用sklearn的cross_val_score進行十折交叉驗證,輸出兩個模型採用最優參數設置後的平均預測準確率,並在控制檯輸出。

from sklearn.model_selection import GridSearchCV
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
import pandas as pd
from sklearn.model_selection import ShuffleSplit
from sklearn.model_selection import cross_val_score

if __name__ == "__main__":
    path = 'iris.data'  # 數據文件路徑
    data = pd.read_csv(path, header=None)
    x = data[list(range(4))]
    y = LabelEncoder().fit_transform(data[4])   #講欒尾花類別編碼

    x = x.iloc[:, :4]
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=1)
    #進行十折交叉驗證的數據預處理

    #criterion='gini'時的情況
    # 使用十折交叉驗證獲取,max_depth(子樹的最大深度)的最優取值
    g1_scores = []
    for i in range(1, 6):
        clf = DecisionTreeClassifier(criterion='gini',max_depth = i )
        scores = cross_val_score(clf, x, y, cv=10, scoring='accuracy')
        g1_scores.append(scores.mean())
    print('criterion=gini 時:------------------------------------------------------------------')
    print('max_depth 分別取 1~5 時得到的準確率:')
    print(g1_scores)
    print('最優值爲: ', max(g1_scores))
    print('最優 max_depth 值爲: ', g1_scores.index(max(g1_scores)) + 1)

    # 使用十折交叉驗證獲取,n_estimators(子樹個數)的最優取值
    g2_scores = []
    for i in range(1, 5):
        clf = DecisionTreeClassifier(criterion='gini',max_features = i )
        scores = cross_val_score(clf, x, y, cv=10, scoring='accuracy')
        g2_scores.append(scores.mean())
    print('max_features 分別取 1~4 時得到的準確率:')
    print(g2_scores)
    print('最優值爲: ', max(g2_scores))
    print('最優 max_features 值爲: ', g2_scores.index(max(g2_scores)) + 1)

    # criterion='entropy'時的情況
    # 使用十折交叉驗證獲取,max_depth(子樹的最大深度)的最優取值
    m1_scores = []
    for i in range(1, 6):
        clf = DecisionTreeClassifier(criterion='entropy', max_depth=i)
        scores = cross_val_score(clf, x, y, cv=10, scoring='accuracy')
        m1_scores.append(scores.mean())
    print('criterion= entropy 時:-----------------------------------------------------------------')
    print('max_depth 分別取 1~5 時得到的準確率:')
    print(m1_scores)
    print('最優值爲: ', max(m1_scores))
    print('最優 max_depth 值爲: ', m1_scores.index(max(m1_scores)) + 1)

    # 使用十折交叉驗證獲取,n_estimators(子樹個數)的最優取值
    m2_scores = []
    for i in range(1, 5):
        clf = DecisionTreeClassifier(criterion='entropy', max_features=i)
        scores = cross_val_score(clf, x, y, cv=10, scoring='accuracy')
        m2_scores.append(scores.mean())
    print('max_features 分別取 1~4 時得到的準確率:')
    print(m2_scores)
    print('最優值爲: ', max(m2_scores))
    print('最優 max_features 值爲: ', m2_scores.index(max(m2_scores)) + 1)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章