昨天,我們把分類函數算法算完,那今天,我打算建立決策樹:
有了第一個最佳分類點和數值後,接下來就要找那個子集的下一個最佳分類點,上次程式只是找尋最佳分割點,並未找到分割資料,所以現在要建立函數來分割資料:
#一個5維資料,共5筆, ,data(第0維為y)
data=[[1,1.01,0.852,5,1.5],[2,2.01,0.31,8,8.1],[1,3.01,0.589,9,5.6],[1,3.01,0.01,8,2.3],[2,4.01,0.258,10,1.1]]
import copy
def split_Data(data, best_feature_col, best_split_value):
new_data = copy.deepcopy(data)
#去除特徵點資料
for i in range(len(new_data)):
new_data[i].remove(data[i][best_feature_col])
leftData, rightData = [], []
leftDataindex,rightDataindex = [], []
#去除特徵後分類資料
for j in range(len(data)):
if data[j][best_feature_col] <= best_split_value:
leftData.append(new_data[j])
leftDataindex.append(j)
else:
rightData.append(new_data[j])
rightDataindex.append(j)
return new_data,leftData,leftDataindex,rightData,rightDataindex, best_feature_col
new_data,leftData,leftDataindex,rightData,rightDataindex, best_feature_col=split_Data(data,best_feature_col,best_split_value)
print("去除特徵後資料:",new_data)
print("去除特徵後左資料:",leftData)
print("左資料在原始資料序列:",leftDataindex)
print("去除特徵後右資料:",rightData)
print("右資料在原始資料序列:",rightDataindex)
print("被去除特徵點:第",split_Data(data, best_feature_col,"位")
這樣子就會得到資料:
去除特徵後資料: [[1, 1.01, 5, 1.5], [2, 2.01, 8, 8.1], [1, 3.01, 9, 5.6], [1, 3.01, 8, 2.3], [2, 4.01, 10, 1.1]]
去除特徵後左資料: [[2, 2.01, 8, 8.1], [1, 3.01, 8, 2.3], [2, 4.01, 10, 1.1]]
左資料在原始資料序列: [1, 3, 4]
去除特徵後右資料: [[1, 1.01, 5, 1.5], [1, 3.01, 9, 5.6]]
右資料在原始資料序列: [0, 2]
被去除特徵點:第 2 位
接著剩餘資料再帶回上次說的分類,就會得到一組決策樹,當然依據資料特性會做出下列限制:
#確認是否為同一類別
def one_data_check(data):
count = 0
#拿第一筆值當範例
check = data[0][0]
for i in range(len(data)):
#check所有資料
if data[i][0]==check:
count+=1
if count==len(data):
return [check]
else:
return False
#確認是否為空
def no_data_check(data):
if len(data)==0:
return True
else:
return False
#類別都分類完
import random as rd
def one_feature_check(data):
count_use={}
if len(data[0])==1:
new_data=[]
for i in range(len(data)):
new_data.append(data[i][0])
for i in new_data:
if i in count_use.keys():
count_use[i]+=1
else:
count_use[i]=1
#確認最大值
max_check=max(count_use, key=count_use.get)
#確認類別是否一樣多
the_same=[]
for key,value in count_use.items():
if(value == max(count_use.values())):
the_same.append(key)
#如果有一樣就隨機取
return rd.sample(the_same,1)
else:
return False
#示範有可能是0或1
print(one_feature_check([[0],[0],[1],[1]]))
這樣子就成功設定好條件
好,今天實作部分就到這,明天再開始做建立樹的後半段動作
當男孩往森林走去時,小屋裡那隻紅色的手,正摸著地上的燈泡碎片,然後像是憤怒一般,他把所有的燈泡碎片全部用手敲碎,奇怪的是,敲擊時完全沒有發出任何聲音,當他敲碎所有碎片後,碎片留下的殘渣在一瞬間變成黑色後,就消失得無影無蹤,這時小屋內的土地開始崩塌,手的主人露了出來,他是一個高高瘦瘦的男人,看起來跟一般人沒有差別,只是他的雙手和雙腳卻有如鮮血般紅潤
--|你在哪裡?到底在哪?在~哪~裡? |-- CS.MM