資源簡介
本文件包括隨機森林的代碼實現和相應的數據集,以及詳盡的中文注釋,已調試通過。代碼有兩份,一份是在網上下載的,另一份是自己整理后編寫的。編程環境為Python2.7。因為只是用來學習隨機森林算法,所以在調參方法沒下多少功夫,正確率可能不太高,當然數據集比較小也是一個原因。感興趣的童鞋可以自己調整參數提高正確率。

代碼片段和文件信息
#-*-?coding:?utf-8?-*-
#?Random?Forest?Algorithm?on?Sonar?Dataset
from?random?import?seed
from?random?import?randrange
from?csv?import?reader
from?math?import?sqrt
from?math?import?log
#?Load?a?CSV?file
def?load_csv(filename):??#導入csv文件
????dataset?=?list()
????with?open(filename?‘r‘)?as?file:
????????csv_reader?=?reader(file)
????????for?row?in?csv_reader:
????????????if?not?row:
????????????????continue
????????????dataset.append(row)
????return?dataset
#?Convert?string?column?to?float
def?str_column_to_float(dataset?column):??#將數據集的第column列轉換成float形式
????for?row?in?dataset:
????????row[column]?=?float(row[column].strip())??#strip()返回移除字符串頭尾指定的字符生成的新字符串。
????????
#?Convert?string?column?to?integer
def?str_column_to_int(dataset?column):????#將最后一列表示標簽的值轉換為Int類型01...
????class_values?=?[row[column]?for?row?in?dataset]
????unique?=?set(class_values)
????lookup?=?dict()
????for?i?value?in?enumerate(unique):
????????lookup[value]?=?i
????for?row?in?dataset:
????????row[column]?=?lookup[row[column]]
????return?lookup
#?Split?a?dataset?into?k?folds
def?cross_validation_split(dataset?n_folds):??#將數據集dataset分成n_flods份,每份包含len(dataset)?/?n_folds個值,每個值由dataset數據集的內容隨機產生,每個值被使用一次
????dataset_split?=?list()
????dataset_copy?=?list(dataset)??#復制一份dataset防止dataset的內容改變
????fold_size?=?len(dataset)?/?n_folds
????for?i?in?range(n_folds):
????????fold?=?list()???#每次循環fold清零,防止重復導入dataset_split
????????while?len(fold)?????????????index?=?randrange(len(dataset_copy))
????????????fold.append(dataset_copy.pop(index))??#將對應索引index的內容從dataset_copy中導出,并將該內容從dataset_copy中刪除。pop()?函數用于移除列表中的一個元素(默認最后一個元素),并且返回該元素的值。
????????dataset_split.append(fold)
????return?dataset_split????#由dataset分割出的n_folds個數據構成的列表,為了用于交叉驗證
#?Calculate?accuracy?percentage??
def?accuracy_metric(actual?predicted):??#導入實際值和預測值,計算精確度
????correct?=?0
????for?i?in?range(len(actual)):
????????if?actual[i]?==?predicted[i]:
????????????correct?+=?1
????return?correct?/?float(len(actual))?*?100.0
#?Split?a?dataset?based?on?an?attribute?and?an?attribute?value?#根據特征和特征值分割數據集
def?test_split(index?value?dataset):
????left?right?=?list()?list()
????for?row?in?dataset:
????????if?row[index]?????????????left.append(row)
????????else:
????????????right.append(row)
????return?left?right
#?Calculate?the?Gini?index?for?a?split?dataset
def?gini_index(groups?class_values):???#個人理解:計算代價,分類越準確,則gini越小
????gini?=?0.0
????for?class_value?in?class_values:??#class_values?=[01]?
????????for?group?in?groups:??????????#groups=(leftright)
????????????size?=?len(group)
????????????if?size?==?0:
????????????????continue
????????????proportion?=?[row[-1]?for?row?in?group].count(class_value)?/?float(size)
????????????gini?+=?(proportion?*?(1.0?-?proportion))??#個人理解:計算代價,分類越準確,則gini越小
????return?gini
#?Select?the?best?split?point?for?a?dataset??#找出分割數據集的最優特征,得到最優的特征in
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????7189??2017-03-20?20:31??RandomForest\RFbymyself.py
?????文件???????11063??2017-03-20?20:32??RandomForest\randomForest.py
?????文件???????86084??2017-03-17?11:29??RandomForest\sonar-all-data.csv
?????文件?????????370??2017-03-20?21:27??RandomForest\閱讀說明.txt
?????目錄???????????0??2017-03-20?20:33??RandomForest\
評論
共有 條評論