基於 scikit-learn 的決策樹分類模型 DecisionTreeClassifier 進行的分類運算javascript
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
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
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
scikit-learn要求全部輸入的值爲數值型,而不能爲咱們本數據中的文字或者字符,所以須要先進行轉化。 數據中的age轉化成三維的一個量:yougth,middle-age,senor,若是是yougth則爲 1 0 0,一樣的能夠轉化其餘屬性。
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)
把原始數據轉化成list字典,是爲了利用python提供的模塊,直接把數據轉化成0-1格式
# Vetorize features
vec = DictVectorizer() # 實例化
dummyX = vec.fit_transform(featureList).toarray()
print("dummyX: " + str(dummyX))
print(vec.get_feature_names())
# vectorize class labels
lb = preprocessing.LabelBinarizer()
dummyY = lb.fit_transform(labelList)
print("dummyY: " + str(dummyY))
# 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