日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

机器学习基础——实现基本的决策树

發布時間:2024/1/17 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习基础——实现基本的决策树 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、決策樹基本流程

?決策樹是常見的機器學習方法。我在學習周志華的機器學習的時候,用python實現了最基礎的ID3算法,其基本思想是: 基于信息論中的信息增益理論,首先找出判斷樣本的最高的信息增益的屬性(或者說特征),然后依次對按該屬性劃分成的子集 進行同樣的選擇信息增益最大的屬性并進行劃分的過程。這是一個典型的(divide-conquer)的過程。

二、最基本的決策樹實現

下面,通過周志華《機器學習》(也叫西瓜書)第四章的例子,我用python實現了基于pandas的DataFrame的數據結構的數據來進行的決策樹的實現(屬性都是離散屬性)。對連續屬性或更一般性的情況,可以調用sklearn的決策樹包來做,這塊放在最后。樣本如下:[python]?view plain?copy
  • #?決策樹??
  • #?習題4.3?實現基于信息熵進行劃分選擇的決策樹算法,并為表4.3中數據??
  • #?生成一顆決策樹??
  • #?表4.3既有離散屬性,也有連續屬性。??
  • #?_*_?coding:UTF-8?_*_??
  • import?pandas?as?pd??
  • import?numpy?as?np??
  • import?os??
  • from?math?import?log2??
  • #?離散的特征的完成了,連續的我用sklearn可以做,就不在此處寫了??
  • def?Entrop(data):??
  • ????entropy?=?dict()??
  • ????for?i?in?data.keys():??
  • ????????good?=?data[i].count('是')??
  • ????????bad?=?data[i].count('否')??
  • ????????length?=?len(data[i])??
  • ????????p1?=?good?/?length??
  • ????????p2?=?bad?/?length??
  • ????????if?p1?==?0.0?or?p2?==?0.0:??
  • ????????????entropy[i]?=?0??
  • ????????else:??
  • ????????????entropy[i]?=?-(p1?*?log2(p1)?+?p2?*?log2(p2))??
  • ????return?entropy??
  • ??
  • def?DecisionTree(entropy,?data,?MaxKey,?threshold,?category):??
  • ????for?i?in?entropy:??
  • ????????sub_data?=?data[data[MaxKey]?==?i]??#?sub_data為子集合??
  • ????????subs_entropy?=?entropy[i]??#?subs_entropy是信息熵??
  • ????????sizes?=?sub_data.count(0)[0]??#?這個子集合的樣本數量??
  • ????????if?subs_entropy?>=?threshold:??
  • ????????????gains?=?dict()??#?信息增益??
  • ????????????data_sample?=?dict()??
  • ????????????Ent?=?dict()??#?信息熵??
  • ????????????for?j?in?category:??
  • ????????????????data_sample[j]?=?sub_data['好瓜'].groupby(sub_data[j]).sum()??
  • ????????????????nn?=?len(data_sample[j])??
  • ????????????????he?=?0??
  • ????????????????for?m?in?range(nn):??
  • ????????????????????good?=?data_sample[j][m].count('是')??
  • ????????????????????bad?=?data_sample[j][m].count('否')??
  • ????????????????????length?=?len(data_sample[j][m])??
  • ????????????????????p1?=?good?/?length??
  • ????????????????????p2?=?bad?/?length??
  • ????????????????????if?good?==?0.0?or?bad?==?0.0?or?length?==?0:??
  • ????????????????????????Ent[j]?=?0??
  • ????????????????????else:??
  • ????????????????????????Ent[j]?=?-(p1?*?log2(p1)?+?p2?*?log2(p2))??
  • ????????????????????he?+=?(length?*?Ent[j])?/?sizes??
  • ????????????????gains[j]?=?subs_entropy?-?he??
  • ????????????if?len(gains)?>?0:??
  • ????????????????maxKey?=?max(gains.items(),?key=lambda?x:?x[1])[0]??
  • ????????????????entropys?=?Entrop(data_sample[maxKey])??
  • ????????????????category.pop(maxKey)??
  • ????????????????print('{0}下面的第一分類是{1}'.format(i,?maxKey))??
  • ????????????????DecisionTree(entropys,?sub_data,?maxKey,?threshold,?category)??
  • ????????????else:??
  • ????????????????highest_class?=?max(sub_data['好瓜'].values)??
  • ????????????????if?highest_class?==?'否':??
  • ????????????????????print('{0}下面的瓜都是壞瓜'.format(i))??
  • ????????????????else:??
  • ????????????????????print('{0}下面的瓜都是好瓜'.format(i))??
  • ????????else:??
  • ????????????highest_class?=?max(sub_data['好瓜'].values)??
  • ????????????if?highest_class?==?'否':??
  • ????????????????print('{0}下面的瓜都是壞瓜'.format(i))??
  • ????????????else:??
  • ????????????????print('{0}下面的瓜都是好瓜'.format(i))??
  • ??
  • ??
  • ??
  • def?main():??
  • ????"""?
  • ????主函數?
  • ????"""??
  • ????dataset_path?=?'./datasets'??#?數據集路徑??
  • ????filename?=?'watermalon_simple.xlsx'??#?文件名稱??
  • ????dataset_filepath?=?os.path.join(dataset_path,?filename)??#?數據集文件路徑??
  • ??
  • ??
  • ????#?step?1:讀取數據??
  • ????data?=?pd.read_excel(dataset_filepath)?#?獲取數據??
  • ????header?=?data.columns?#?獲取列名??
  • ????sums?=?data.count()[0]??#?樣本個數??
  • ????#?print(type(header))??
  • ????#?print(header[1:])??
  • ??
  • ????#?step?2:取出6個特征中每個特征的子集??
  • ????category?=?dict()??
  • ????for?i?in?header[1:-1]:??
  • ????????category[i]?=?set(data[i])??
  • ??
  • ????#?step?3:計算信息熵??
  • ????#?1)?初始樣本的信息熵??
  • ????Ent?=?dict()??
  • ????number?=?data['好瓜'].groupby(data['好瓜']).sum()??
  • ????p1?=?len(number['是'])?/?sums??#?好瓜的個數/總共個數??
  • ????p2?=?len(number['否'])?/?sums??#?壞瓜的個數/總共個數??
  • ????Ent["總"]?=?-(p1*log2(p1)?+?p2*log2(p2))??
  • ??
  • ????#?2)?計算每個屬性的信息增益??
  • ????Gain?=?dict()??
  • ????data_sample?=?dict()??
  • ????for?i?in?category:??
  • ????????data_sample[i]?=?data['好瓜'].groupby(data[i]).sum()??
  • ????????#?每一個屬性有幾種維度?如色澤有?青綠、烏黑、淺白三種,則n?=?3??
  • ????????n?=?category[i]??
  • ????????#?print(len(data_sample[i]))??
  • ????????#?print(data_sample[i])??
  • ????????he?=?0??
  • ????????for?j?in?range(len(n)):??
  • ????????????good?=?data_sample[i][j].count('是')??
  • ????????????bad?=?data_sample[i][j].count('否')??
  • ????????????length?=?len(data_sample[i][j])??
  • ????????????p1?=?good?/?length??
  • ????????????p2?=?bad?/?length??
  • ????????????if?p1?==?0.0?or?p2?==?0.0:??
  • ????????????????Ent[j]?=?0??
  • ????????????else:??
  • ????????????????Ent[j]?=?-(p1?*?log2(p1)?+?p2?*?log2(p2))??
  • ????????????he?+=?(length?*?Ent[j])/sums??
  • ????????Gain[i]?=?Ent['總']?-?he??
  • ??
  • ????#?3)?找到value最大對應的key?即找到按增益準則劃分的分類最佳情況??
  • ????#????這里的MaxKey是紋理??
  • ????MaxKey?=?max(Gain.items(),?key=lambda?x:?x[1])[0]??
  • ????print('主分類是{}'.format(MaxKey))??
  • ??
  • ????#?4)?根據這個情況,分別計算其子分類的信息熵??
  • ????#????entropy為字典??
  • ????entropy?=?Entrop(data_sample[MaxKey])??
  • ????print(entropy)??
  • ????#?{'清晰':?0.7642045065086203,?'稍糊':?0.7219280948873623,?'模糊':?0}??
  • ??
  • ????#?4.1)接下來的分類不能再用這個分了:即把這個類別扔掉??
  • ????category.pop(str(MaxKey))??
  • ????#?print(category)??
  • ??
  • ??
  • ????#?5)?對信息熵大于某一閾值(threshold)的情況進行繼續劃分,如果小于則統一認為是某種情況,不再??
  • ????#????繼續分類。例如:本例對模糊的Ent=0,所以不對模糊類別進行繼續劃分。??
  • ????threshold?=?0.05??
  • ????DecisionTree(entropy,?data,?MaxKey,?threshold,?category)??
  • ??
  • ??
  • ??
  • ??
  • ??
  • ??
  • if?__name__?==?"__main__":??
  • ????main()??
  • 上面是我的代碼,如果有不清楚的地方可以交流。下面貼上用sklearn的代碼:
    [python]?view plain?copy
  • from?sklearn?import?tree??
  • import?numpy?as?np??
  • from?sklearn.feature_extraction?import?DictVectorizer??
  • #?from?sklearn?import?preprocessing??
  • from?sklearn.cross_validation?import?train_test_split??
  • import?xlrd??
  • workbook?=?xlrd.open_workbook('watermalon_simple.xlsx')??
  • booksheet?=?workbook.sheet_by_name('Sheet1')??
  • X?=?list()??
  • Y?=?list()??
  • for?row?in?range(booksheet.nrows):??
  • ????????row_data?=?[]??
  • ????????ll?=?dict()??
  • ????????#?ll?=?list()??
  • ????????mm?=?list()??
  • ????????for?col?in?range(1,?booksheet.ncols-1):??
  • ????????????cel?=?booksheet.cell(row,?col)??
  • ????????????val?=?cel.value??
  • ????????????cat?=?['色澤',?'根蒂',?'敲聲',?'紋理',?'觸感']??
  • ????????????#?ll.append(val)??
  • ????????????ll[cat[col-1]]?=?val??
  • ????????for?col?in?range(booksheet.ncols-1,booksheet.ncols):??
  • ????????????cel?=?booksheet.cell(row,?col)??
  • ????????????val?=?cel.value??
  • ????????????mm.append(val)??
  • ????????print('第{}行讀取完畢'.format(row))??
  • ????????X.append(ll)??
  • ????????Y.append(mm)??
  • #?X?=?X[1:]?#和下面的效果一樣,即把第一列刪除??
  • X.pop(0);?Y.pop(0)??
  • #?print(X)??
  • print(X);?print(Y)??
  • #?1表示好瓜?0表示壞瓜??
  • y?=?[1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0]??
  • ??
  • #?Vector?Feature??
  • dummyY?=?np.array(y)??
  • vec?=?DictVectorizer()??
  • dummyX?=?vec.fit_transform(X).toarray()??
  • ??
  • ??
  • #拆分數據??
  • x_train,?x_test,?y_train,?y_test?=?train_test_split(dummyX,?dummyY,?test_size=0.3)??
  • ??
  • #?using?desicionTree?for?classfication??
  • clf?=?tree.DecisionTreeClassifier(criterion="entropy")??
  • #?創建一個分類器,entropy決定了用ID3算法??
  • clf?=?clf.fit(x_train,?y_train)??
  • ??
  • ??
  • #?print(clf.feature_importances_)??
  • answer=clf.predict(x_test)??
  • print(u'系統進行測試')??
  • #?print(x_train)??
  • print(answer)??
  • print(y_test)??
  • #?print(np.mean(answer==y_train))??
  • ??
  • #?可視化??
  • with?open("alalala.dot",?"w")?as?f:??
  • ?????f?=?tree.export_graphviz(clf,?feature_names=vec.get_feature_names(),?out_file?=?f)??
  • 總結

    以上是生活随笔為你收集整理的机器学习基础——实现基本的决策树的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。