03機器學習實戰之決策樹scikit-learn實現

sklearn.tree.DecisionTreeClassifier

基於 scikit-learn 的決策樹分類模型 DecisionTreeClassifier 進行的分類運算javascript

http://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html#sklearn.tree.DecisionTreeClassifiercss

class sklearn.tree.DecisionTreeClassifier(criterion=’gini’, splitter=’best’, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, class_weight=None, presort=False)

參數:html

criterion : 默認爲 "gini"。是特徵選擇的標準,可選擇基尼係數 "gini" 或者 信息熵 "entropy"。html5

splitter : 默認爲 "best"。"best" 是在特徵的全部劃分點中找出最優的劃分點。"random" 是隨機的在部分劃分點中找局部最優的劃分點。"best" 適合樣本量不大的時候,若是樣本數據量很是大,推薦 "random"。java

max_depth : 默認爲 None。設置樹的最大深度。若是是 None,則不限制子樹的深度,直到全部葉子是純的,或者全部葉子包含少於 min_samples_split 的樣本。node

min_samples_split : 默認爲 2,能夠是 int 或者 float 格式。限制子樹繼續劃分的條件,若是節點的樣本數小於這個值,則不會再劃分。當爲 float 值時,拆分的最小樣本數爲 ceil(min_samples_split * n_samples)。python

min_samples_leaf : 默認爲1,能夠是 int 或者 float 格式。設置葉子節點的最小樣本數,若是某葉子節點數目小於樣本數,則會和兄弟節點一塊兒被剪枝。當爲 float 值時,此時葉子最小樣本數爲 ceil(min_samples_leaf * n_samples)。jquery

min_weight_fraction_leaf : 葉子節點最小的樣本權重和。這個值限制了葉子節點全部樣本權重和的最小值,若是小於這個值,則會和兄弟節點一塊兒被剪枝。 默認是0,就是不考慮權重問題。通常來講,若是咱們有較多樣本有缺失值,或者分類樹樣本的分佈類別誤差很大,就會引入樣本權重,這時咱們就要注意這個值了。linux

max_features : 劃分時考慮的最大特徵數,默認爲 None。是劃分時考慮的最大特徵數,android

  • 若是是 int, 最大特徵數爲此 max_features 值。
  • 若是是 float,  值爲 int(max_features * n_features)。
  • 若是是 「auto」, 值爲 max_features=sqrt(n_features)。
  • 若是是 「sqrt」, 值爲 max_features=sqrt(n_features)。
  • 若是是 「log2」, 值爲 max_features=log2(n_features)。
  • 若是是 None, 值爲 max_features=n_features 表示劃分時考慮全部的特徵數。
  • random_state : 默認爲 None。隨機種子。

max_leaf_nodes : 最大葉子節點數,默認爲 None。限制最大葉子節點數,能夠防止過擬合若是爲 None,則不顯示最大的葉子節點數。

class_weight : 指定樣本各種別的的權重。默認爲 None,表示沒有權重偏倚。若是爲 "balanced",則算法會本身計算權重,樣本少的權重高,公式:n_samples / (n_classes * np.bincount(y))。

min_impurity_decrease : 默認爲0。參數的意義是,若是繼續分裂能減小的雜質大於或等於該值,則分裂節點。

min_impurity_split : 若是節點的不純度高於閾值,節點將分裂。(已被 min_impurity_decrease 代替)。

presort : 設置數據是否預排序,默認爲 False。在大型數據集上,設置爲 True 可能反而會下降訓練速度,在較小數據集或者限制深度的樹上使用 True 能加快訓練速度。

屬性:

max_features_ : 特徵的數量

feature_importances_ : 特徵的重要性。

原文:https://blog.csdn.net/tz_zs/article/details/73796241

 

 

 

In [87]:
import csv
from sklearn.feature_extraction import DictVectorizer
from sklearn import tree
from sklearn import preprocessing
from sklearn.externals.six import StringIO

# Read in the csv file and put features into list of dict and list
#  of class label
# open()函數最好用絕對路徑
allElectronicsData = open(r'd:/AllElectronics.csv', 'rt')  # 此處必須用rt不能用rb讀取文本文件
reader = csv.reader(allElectronicsData)
headers = next(reader)  # 此處已改
headers
Out[87]:
['RID', 'age', 'income', 'student', 'credit_rating', 'class_buys_computer']
 

scikit-learn要求全部輸入的值爲數值型,而不能爲咱們本數據中的文字或者字符,所以須要先進行轉化。 數據中的age轉化成三維的一個量:yougth,middle-age,senor,若是是yougth則爲 1 0 0,一樣的能夠轉化其餘屬性。

In [88]:
featureList = []
labelList = []

for row in reader:
    labelList.append(row[len(row) - 1])  # row爲一個list,不能用row[-1]
    rowDict = {}
    for i in range(1, len(row) - 1):
        rowDict[headers[i]] = row[i]
    featureList.append(rowDict)
print(featureList)
 
[{'age': 'youth', 'income': 'high', 'student': 'no', 'credit_rating': 'fair'}, {'age': 'youth', 'income': 'high', 'student': 'no', 'credit_rating': 'excellent'}, {'age': 'middle_aged', 'income': 'high', 'student': 'no', 'credit_rating': 'fair'}, {'age': 'senior', 'income': 'medium', 'student': 'no', 'credit_rating': 'fair'}, {'age': 'senior', 'income': 'low', 'student': 'yes', 'credit_rating': 'fair'}, {'age': 'senior', 'income': 'low', 'student': 'yes', 'credit_rating': 'excellent'}, {'age': 'middle_aged', 'income': 'low', 'student': 'yes', 'credit_rating': 'excellent'}, {'age': 'youth', 'income': 'medium', 'student': 'no', 'credit_rating': 'fair'}, {'age': 'youth', 'income': 'low', 'student': 'yes', 'credit_rating': 'fair'}, {'age': 'senior', 'income': 'medium', 'student': 'yes', 'credit_rating': 'fair'}, {'age': 'youth', 'income': 'medium', 'student': 'yes', 'credit_rating': 'excellent'}, {'age': 'middle_aged', 'income': 'medium', 'student': 'no', 'credit_rating': 'excellent'}, {'age': 'middle_aged', 'income': 'high', 'student': 'yes', 'credit_rating': 'fair'}, {'age': 'senior', 'income': 'medium', 'student': 'no', 'credit_rating': 'excellent'}]
 

把原始數據轉化成list字典,是爲了利用python提供的模塊,直接把數據轉化成0-1格式

In [89]:
# Vetorize features
vec = DictVectorizer()  # 實例化
dummyX = vec.fit_transform(featureList).toarray()

print("dummyX: " + str(dummyX))
print(vec.get_feature_names())
 
dummyX: [[0. 0. 1. 0. 1. 1. 0. 0. 1. 0.]
 [0. 0. 1. 1. 0. 1. 0. 0. 1. 0.]
 [1. 0. 0. 0. 1. 1. 0. 0. 1. 0.]
 [0. 1. 0. 0. 1. 0. 0. 1. 1. 0.]
 [0. 1. 0. 0. 1. 0. 1. 0. 0. 1.]
 [0. 1. 0. 1. 0. 0. 1. 0. 0. 1.]
 [1. 0. 0. 1. 0. 0. 1. 0. 0. 1.]
 [0. 0. 1. 0. 1. 0. 0. 1. 1. 0.]
 [0. 0. 1. 0. 1. 0. 1. 0. 0. 1.]
 [0. 1. 0. 0. 1. 0. 0. 1. 0. 1.]
 [0. 0. 1. 1. 0. 0. 0. 1. 0. 1.]
 [1. 0. 0. 1. 0. 0. 0. 1. 1. 0.]
 [1. 0. 0. 0. 1. 1. 0. 0. 0. 1.]
 [0. 1. 0. 1. 0. 0. 0. 1. 1. 0.]]
['age=middle_aged', 'age=senior', 'age=youth', 'credit_rating=excellent', 'credit_rating=fair', 'income=high', 'income=low', 'income=medium', 'student=no', 'student=yes']
In [91]:
# vectorize class labels
lb = preprocessing.LabelBinarizer()
dummyY = lb.fit_transform(labelList)
print("dummyY: " + str(dummyY))
 
dummyY: [[0]
 [0]
 [1]
 [1]
 [1]
 [0]
 [1]
 [0]
 [1]
 [1]
 [1]
 [1]
 [1]
 [0]]
In [96]:
# Using decision tree for classification
# clf = tree.DecisionTreeClassifier()
clf = tree.DecisionTreeClassifier(criterion='entropy')
clf = clf.fit(dummyX, dummyY)
# Visualize model
with open(r"d:/allElectronicInformationGainOri.dot", 'w') as f:
    f = tree.export_graphviz(clf, feature_names=vec.get_feature_names(), out_file=f)
 

由於上圖中的路徑爲d盤根目錄,進入cmd命令而後進入d盤cd \,d:,執行下面的命令: dot -Tpdf allElectronicInformationGainOri.dot -o outpu.pdf 轉化爲pdf

相關文章
相關標籤/搜索