randomForest 사용해보기

2018. 4. 25. 02:47Python-이론/python-인공지능

randomForest 사용하기



randomForest는 레오 브라이만이 제안한 딥러닝 알고리즘입니다. 주로 회귀와 클러스터링, 분류를 구현하는데 유용합니다. 구조는 데이터들이 입력되는데 데이터들을 무작위로 샘플링하여서 여러개의 의사결정 트리들이 만들어집니다. 각 트리마다 답을 산출하는데 산출한 답을 종합하여 결과를 내놓습니다. 여러개의 트리로 답을 산출하니깐 결과의 정확도가 높습니다.


randomForest의 구조

버섯 예제1
버섯예제 데이터

import pandas as pd
from sklearn.model_selection import  train_test_split
from sklearn.ensemble import RandomForestClassifier as forest
from sklearn import metrics

csvFile = pd.read_csv('mushroom.csv',header=None)
label = []
data = []
for idx, value in csvFile.iterrows():
    label.append(value.ix[0])
    dataList = []
    for v in value.ix[1:]:
        dataList.append(ord(v))
    data.append(dataList)

trainData, testData,trainLabel,testLabel = train_test_split(data,label)
clf = forest()
clf.fit(trainData,trainLabel)
pre = clf.predict(testData)
report = metrics.classification_report(pre,testLabel)
print(report)




하지만 위와 같은 코드는 문자 하나로만 설명이되어 있어서 다행인데 만약에 '초록':1, '빨강':2, '주황':3로 되어있으면 데이터의 값이 비슷하고 2배 3배씩 하면 데이터들이 충돌 할 수 있는 가능성도 있다. 따라서 이런문제를 발생시키지 않기 위해선 초록 은 [1, 0, 0, 0], 빨강은 [0, 1, 0, 0], 주황은 [0,0,1,0] 이런식으로 데이터를 정하면 값이 겹칠일이 없어진다. 위의 코드를 이런 식으로 바꾸어 보겠다



import pandas as pd
from sklearn import metrics
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier as forest

csvFile = pd.read_csv('mushroom.csv',header=None)

data = []
label = []
attrLines =[]
for csv_length,value in csvFile.iterrows():
    label.append(value.ix[0])
    exdata = []
    for num,v in enumerate(value.ix[1:]):
        if csv_length == 0:
            attr = {'dic':{},'cnt':0}
            attrLines.append(attr)
        else:
            attr = attrLines[num]
        d = [0,0,0,0,0,0,0,0,0,0,0,0]
        if v not in attr['dic']:
            idx = attr['cnt']
            attr['dic'][v]= idx
            attr['cnt'] += 1
        else :
            idx = attr['dic'][v]
        d[idx] = 1
        exdata += d
    data.append(exdata)

trainData, testData, trainLabel, testLabel = train_test_split(data,label)

clf = forest()
clf.fit(trainData,trainLabel)
pre = clf.predict(testData)
report = metrics.classification_report(pre,testLabel)
print(report)


이코드는 조금 이해하기 어려웠다. 처음은 라벨값을 구해주고 그다음부터가 시작이다. 처음반복문 돌때 csv파일 한줄의 각각의 데이터마다 딕셔너리를 만들어준다. 그다음 딕셔너리에 그버섯이 갖는 특징 들을 등록함으로 서 2번째 데이터의 특징을 [0,0,0,0,0,0,0,0,0]에 등록해준다. 다음에 같은 특징이 나왔을 때도 그 값의 인덱스 숫자만 뽑아와서 다시 배열에 등록해준다. 배열들을 끝에서는 모두 합쳐서 입력할 데이터를 만들어준다.