"Scikit-learn"의 두 판 사이의 차이

Pywiki
둘러보기로 가기 검색하러 가기
 
(같은 사용자의 중간 판 9개는 보이지 않습니다)
1번째 줄: 1번째 줄:
 
== 개요 ==
 
== 개요 ==
 
사이킷런. 파이썬 머신러닝 라이브러리의 기준 격인 라이브러리.
 
사이킷런. 파이썬 머신러닝 라이브러리의 기준 격인 라이브러리.
 +
 +
기계학습을 구현하는데 필요한 대부분의 기능을 담고 있다.
  
 
== 사용 ==
 
== 사용 ==
16번째 줄: 18번째 줄:
 
|데이터를 다룰 때 사용할 도구.
 
|데이터를 다룰 때 사용할 도구.
 
|pip install pandas
 
|pip install pandas
|-
 
|
 
|
 
|
 
 
|}
 
|}
  
 
=== 기초 사용법 ===
 
=== 기초 사용법 ===
 +
일반적으로 판단근거를 data, 판단결과를 label이라 구분하여 사용한다. 혹은 함수의 형태를 본따 x, y로.
 
{| class="wikitable"
 
{| class="wikitable"
 
!의도
 
!의도
30번째 줄: 29번째 줄:
 
|훈련데이터와 테스트데이터 분리
 
|훈련데이터와 테스트데이터 분리
 
|귀찮은 일을 모듈이 해준다.
 
|귀찮은 일을 모듈이 해준다.
 +
{| class="wikitable"
 +
|+자주 사용하는 옵션
 +
!의도
 +
!설명
 +
|-
 +
|stratify=df['해당열']
 +
|범주별 비율을 비슷하게 맞춰 데이터를 분리한다.
 +
(원 데이터에서 하나의 범주만 너무 많거나 적은 경우 사용하여 비율을 지킨다.)
 +
|}
 
|<syntaxhighlight lang="python">
 
|<syntaxhighlight lang="python">
 
from sklearn.model_selection import train_test_split
 
from sklearn.model_selection import train_test_split
  
train_data, test_data, train_label, test_label = train_test_split(data, label)
+
train_x, test_x, train_y, test_y = train_test_split(data, label, test_size=0.2, train_size=0.8, ,random_state=1)
</syntaxhighlight>
+
</syntaxhighlight>random_state는 random함수의 seed값을 고정하여 매번 같은 데이터를 얻게 하기 위함.(test용, 교육용에서 채점 등에 사용. 모델이 랜덤한 효과로 좋아지지 않도록.)
|-
 
|정답률 예측
 
|
 
|<syntaxhighlight lang="python">
 
right =0; total =0
 
for idx, answer in enumerate(label):  # 레이블의 인덱스를 얻는다.
 
    p = pre[idx]  # 인덱스값에 해당하는 예측값.
 
    if p = answer: right += 1  # 정답과 일치한다면 right에 하나 추가.
 
    total += 1
 
print("정답률 : ", right/total)
 
</syntaxhighlight>간단하게 모듈을 사용할 수도 있다.<syntaxhighlight lang="python">
 
from sklearn import metrics  # 추가로 가져온다.
 
  
score = metrics.accuracy_score(label, pre)  # 레이블과 예측값을 넣는다.
+
일반적으로 이 대신 test_size=0.2 를 사용한다.(20%가 test 데이터로)(전체 값이 1이 아닌지, train_size와 같이 넣는다.)
print('정답률 : ', score)
 
</syntaxhighlight>
 
 
|-
 
|-
 
|학습한 매개변수 저장하기
 
|학습한 매개변수 저장하기
68번째 줄: 62번째 줄:
 
|}
 
|}
  
 +
= 결측치 처리 =
 +
{| class="wikitable"
 +
!방법
 +
!설명
 +
|-
 +
|DataFrame을 사용하는 경우
 +
|[[결측치 다루기:pandas]] 문서를 참고하자.
 +
|}
 +
= 모델 검증 =
 +
{| class="wikitable"
 +
!방법
 +
!설명
 +
|-
 +
|평균 에러정도 검증
 +
|<syntaxhighlight lang="python">
 +
from sklearn.metrics import mean_absolute_error
 +
 +
data = df.....  # 예상에 쓰일 df.
 +
y = data.판단할열  # 실제 결과
 +
# 근거데이터 만들기.
 +
features = ['열1', '열2', ...]  # 판단할 자료가 될 열을 지정한다.
 +
x = data[features]  # 판단근거를 준비한다.
 +
 +
predict = machine.predict(data)  # 결과 예상하기.
 +
mean_absolute_error(y, predict)  # 예상결과와 실제값을 비교하여 평균 에러를 반환한다.
 +
</syntaxhighlight>둘 사이의 차이를 구하는 함수로, 순서는 달라져도 상관 없다.
 +
|-
 +
|정답률 검증
 +
|<syntaxhighlight lang="python">
 +
right =0; total =0
 +
for idx, answer in enumerate(label):  # 레이블의 인덱스를 얻는다.
 +
    p = pre[idx]  # 인덱스값에 해당하는 예측값.
 +
    if p = answer: right += 1  # 정답과 일치한다면 right에 하나 추가.
 +
    total += 1
 +
print("정답률 : ", right/total)
 +
</syntaxhighlight>간단하게 모듈을 사용할 수도 있다.<syntaxhighlight lang="python">
 +
from sklearn.metrics import accuracy_score  # 추가로 가져온다.
 +
 +
score = accuracy_score(label, pre)  # 레이블과 예측값을 넣는다.
 +
print('정답률 : ', score)
 +
</syntaxhighlight>
 +
|}
 
== SVM 알고리즘 ==
 
== SVM 알고리즘 ==
 
사용할 수 있는 SVM 알고리즘은 다음과 같다. 객체를 만들 때 알고리즘 이름만 바꾸어주면 된다.
 
사용할 수 있는 SVM 알고리즘은 다음과 같다. 객체를 만들 때 알고리즘 이름만 바꾸어주면 된다.
140번째 줄: 176번째 줄:
 
</syntaxhighlight>
 
</syntaxhighlight>
 
|}
 
|}
 
== 랜덤 포레스트 ==
 
{| class="wikitable"
 
!절차
 
!설명
 
!방법
 
|-
 
|패키지 불러오기 및 데이터 정리
 
|
 
|<syntaxhighlight lang="python">
 
from sklearn.enssemble import RandomForestClassifier
 
 
data = [
 
    [1,2,4],
 
    [1,5,3],
 
    [1,5,2]
 
    ]
 
   
 
# 데이터와 레이블 정리
 
data = []
 
label = []
 
for row in data:
 
    data.append(row[0], row[1])  # 판단의 기초가 되는 데이터리스트를 만든다.
 
    label.append(row[2])  # 판단의 결과를 모은다.
 
</syntaxhighlight>데이터프레임을 활용하는 경우.(열 이름을 사용해 분리하는 게 가장 간단하고 직관적이다.)
 
|-
 
|학습
 
|일반적으로 machine이라는 이름보다,
 
 
classifier의 약자인 clf를 주로 쓴다.
 
|<syntaxhighlight lang="python">
 
machine = RandomForestClassifier()  # 객체 지정
 
machine.fit(data, label)  # 데이터와 레이블 지정
 
</syntaxhighlight>
 
|}
 
이후 사용법은 위와 같다.
 
  
 
== 크로스 밸리데이션 ==
 
== 크로스 밸리데이션 ==
223번째 줄: 223번째 줄:
 
</syntaxhighlight>
 
</syntaxhighlight>
 
|}
 
|}
[[분류:머신러닝 프레임워크]]
+
[[분류:머신러닝 라이브러리]]
 +
[[분류:Scikit-learn]]

2023년 2월 5일 (일) 10:37 기준 최신판

1 개요[편집 | 원본 편집]

사이킷런. 파이썬 머신러닝 라이브러리의 기준 격인 라이브러리.

기계학습을 구현하는데 필요한 대부분의 기능을 담고 있다.

2 사용[편집 | 원본 편집]

절차 설명 방법
패키지 설치 관련된 도구들도 한꺼번에 설치된다.

(numpy, scipy, joblib, threadpoolctl과 함께.)

pip install scikit-learn
판다스 설치 데이터를 다룰 때 사용할 도구. pip install pandas

2.1 기초 사용법[편집 | 원본 편집]

일반적으로 판단근거를 data, 판단결과를 label이라 구분하여 사용한다. 혹은 함수의 형태를 본따 x, y로.

의도 설명 방법
훈련데이터와 테스트데이터 분리 귀찮은 일을 모듈이 해준다.
자주 사용하는 옵션
의도 설명
stratify=df['해당열'] 범주별 비율을 비슷하게 맞춰 데이터를 분리한다.

(원 데이터에서 하나의 범주만 너무 많거나 적은 경우 사용하여 비율을 지킨다.)

from sklearn.model_selection import train_test_split

train_x, test_x, train_y, test_y = train_test_split(data, label, test_size=0.2, train_size=0.8, ,random_state=1)
random_state는 random함수의 seed값을 고정하여 매번 같은 데이터를 얻게 하기 위함.(test용, 교육용에서 채점 등에 사용. 모델이 랜덤한 효과로 좋아지지 않도록.)

일반적으로 이 대신 test_size=0.2 를 사용한다.(20%가 test 데이터로)(전체 값이 1이 아닌지, train_size와 같이 넣는다.)

학습한 매개변수 저장하기 매번 새로이 학습하는 일은 번거롭다.
from sklearn.externals import joblib

joblib.dump(객체, "경로.pkl")  # 교육한 객체를 .pkl 파일로 저장한다.
학습데이터 읽기 저장했으면 읽어야지.
file = "경로.pkl"
객체 = joblib.load(file)

3 결측치 처리[편집 | 원본 편집]

방법 설명
DataFrame을 사용하는 경우 결측치 다루기:pandas 문서를 참고하자.

4 모델 검증[편집 | 원본 편집]

방법 설명
평균 에러정도 검증
from sklearn.metrics import mean_absolute_error

data = df.....  # 예상에 쓰일 df.
y = data.판단할열  # 실제 결과
# 근거데이터 만들기.
features = ['열1', '열2', ...]  # 판단할 자료가 될 열을 지정한다.
x = data[features]  # 판단근거를 준비한다.

predict = machine.predict(data)  # 결과 예상하기.
mean_absolute_error(y, predict)  # 예상결과와 실제값을 비교하여 평균 에러를 반환한다.
둘 사이의 차이를 구하는 함수로, 순서는 달라져도 상관 없다.
정답률 검증
right =0; total =0
for idx, answer in enumerate(label):  # 레이블의 인덱스를 얻는다.
    p = pre[idx]  # 인덱스값에 해당하는 예측값.
    if p = answer: right += 1  # 정답과 일치한다면 right에 하나 추가.
    total += 1
print("정답률 : ", right/total)
간단하게 모듈을 사용할 수도 있다.
from sklearn.metrics import accuracy_score  # 추가로 가져온다.

score = accuracy_score(label, pre)  # 레이블과 예측값을 넣는다.
print('정답률 : ', score)

4.1 SVM 알고리즘[편집 | 원본 편집]

사용할 수 있는 SVM 알고리즘은 다음과 같다. 객체를 만들 때 알고리즘 이름만 바꾸어주면 된다.

알고리즘 설명 방법
SVC(Classfication) 표준.
NuSVC 위와 수학적으로 같으나, 오류처리방법이 다르다.
LinearSVC 선형. 계산이 빠르다.
절차 설명 방법
패키지 불러오기 및 데이터 정리
from sklearn import svm

data = [
    [1,2,4],
    [1,5,3],
    [1,5,2]
    ]
    
# 데이터와 레이블 정리
data = []
label = []
for row in data:
    data.append(row[0], row[1])  # 판단의 기초가 되는 데이터리스트를 만든다.
    label.append(row[2])  # 판단의 결과를 모은다.
데이터프레임을 활용하는 경우.(열 이름을 사용해 분리하는 게 가장 간단하고 직관적이다.)
df = pd.DataFrame(data)
data = df.ix[, 0:1]  # 모든 데이터의 0~1 인덱스에 해당하는 것을 데이터로.
label = df.ix[:,2]  # 모든데이터의 인덱스 2에 해당하는 것을 레이블로.
학습객체 지정 및 학습 일반적으로 machine이라는 이름보다,

classifier의 약자인 clf를 주로 쓴다.

machine = svm.SVC()  # SVM객체 지정
machine.fit(data, label)  # 데이터와 레이블 지정
예측해보기 위에서 학습한 데이터로 예측해본다.

데이터 갯수만큼 예측결과를 내놓는다.

pre = machine.predict(data)  # 새로운 데이터를 머신 객체에 넣어주어 예측결과를 얻어본다.
확인해보기 얼마나 잘 맞았는지 검증해본다.
from sklearn import metrics  # 추가로 가져온다.

score = metrics.accuracy_score(label, pre)  # 레이블과 예측값을 넣는다.
print('정답률 : ', score)

4.2 크로스 밸리데이션[편집 | 원본 편집]

절차 설명 방법
크로스밸리데이션 하기 검증한다.

결과는 나누는 데이터 갯수만큼 배열(numpy.ndarray)로 나온다.

from sklearn import svm, model_selection  # svm에 대한 벨리데리션을 실행해본다.

clf = svm.SVC()
scores = model_selection.cross_val_score(clf, data, label, cv=5)  # 5개의 데이터로 나누어 진행.

4.3 매개변수 찾기. 그리드 서치[편집 | 원본 편집]

각각의 학습방법에 대해 매개변수를 조절해야 할 필요가 있다. 관련된 변수의 최적값을 자동으로 찾아주는 기능. 정답률을 개선시켜준다.

단지, 시간이 더 오래걸린다.

절차 설명 방법
모델 부르기 및 그리드서치 매개변수 설정 매개변수의 후보들을 등록한다.
from sklearn import svm  # svm에 대해 실행.
from sklearn.grid_search import GridSearchCV

params = [
    {"C":[1,10,100,1000], "kernel":['linear']},
    {"C":[1,10,100,1000], "kernel":['rbf'], "gamma":[0.001, 0.0001]}
]
그리드서치 수행 n_jobs는 병렬계산할 프로세스 지정. -1은 자동으로 진행한다는 의미.
clf = GridSearchCV(svm.SVC(), params, n_jobs=-1)  # 그리드서치 관련내용이 담긴 객체를 생성.
clf.fit(train_data, train_label)  # 이 객체를 학습시킨다.