"Scikit-learn"의 두 판 사이의 차이
둘러보기로 가기
검색하러 가기
(→기초 사용법) |
|||
(사용자 2명의 중간 판 12개는 보이지 않습니다) | |||
1번째 줄: | 1번째 줄: | ||
== 개요 == | == 개요 == | ||
사이킷런. 파이썬 머신러닝 라이브러리의 기준 격인 라이브러리. | 사이킷런. 파이썬 머신러닝 라이브러리의 기준 격인 라이브러리. | ||
+ | |||
+ | 기계학습을 구현하는데 필요한 대부분의 기능을 담고 있다. | ||
== 사용 == | == 사용 == | ||
16번째 줄: | 18번째 줄: | ||
|데이터를 다룰 때 사용할 도구. | |데이터를 다룰 때 사용할 도구. | ||
|pip install pandas | |pip install pandas | ||
− | |||
− | |||
− | |||
− | |||
|} | |} | ||
+ | |||
+ | === 기초 사용법 === | ||
+ | 일반적으로 판단근거를 data, 판단결과를 label이라 구분하여 사용한다. 혹은 함수의 형태를 본따 x, y로. | ||
{| class="wikitable" | {| class="wikitable" | ||
!의도 | !의도 | ||
28번째 줄: | 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_x, test_x, train_y, test_y = train_test_split(data, label, test_size=0.2, train_size=0.8, ,random_state=1) | |
− | + | </syntaxhighlight>random_state는 random함수의 seed값을 고정하여 매번 같은 데이터를 얻게 하기 위함.(test용, 교육용에서 채점 등에 사용. 모델이 랜덤한 효과로 좋아지지 않도록.) | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | </syntaxhighlight> | ||
− | |||
− | + | 일반적으로 이 대신 test_size=0.2 를 사용한다.(20%가 test 데이터로)(전체 값이 1이 아닌지, train_size와 같이 넣는다.) | |
− | |||
− | |||
|- | |- | ||
|학습한 매개변수 저장하기 | |학습한 매개변수 저장하기 | ||
66번째 줄: | 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 알고리즘은 다음과 같다. 객체를 만들 때 알고리즘 이름만 바꾸어주면 된다. | ||
+ | {| class="wikitable" | ||
+ | !알고리즘 | ||
+ | !설명 | ||
+ | !방법 | ||
+ | |- | ||
+ | |SVC(Classfication) | ||
+ | |표준. | ||
+ | | | ||
+ | |- | ||
+ | |NuSVC | ||
+ | |위와 수학적으로 같으나, 오류처리방법이 다르다. | ||
+ | | | ||
+ | |- | ||
+ | |LinearSVC | ||
+ | |선형. 계산이 빠르다. | ||
+ | | | ||
+ | |} | ||
{| class="wikitable" | {| class="wikitable" | ||
!절차 | !절차 | ||
95번째 줄: | 151번째 줄: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
|- | |- | ||
− | |학습 | + | |학습객체 지정 및 학습 |
|일반적으로 machine이라는 이름보다, | |일반적으로 machine이라는 이름보다, | ||
120번째 줄: | 176번째 줄: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
|} | |} | ||
− | [[분류:머신러닝 | + | |
+ | == 크로스 밸리데이션 == | ||
+ | {| class="wikitable" | ||
+ | !절차 | ||
+ | !설명 | ||
+ | !방법 | ||
+ | |- | ||
+ | |크로스밸리데이션 하기 | ||
+ | |검증한다. | ||
+ | |||
+ | 결과는 나누는 데이터 갯수만큼 배열(numpy.ndarray)로 나온다. | ||
+ | |<syntaxhighlight lang="python"> | ||
+ | from sklearn import svm, model_selection # svm에 대한 벨리데리션을 실행해본다. | ||
+ | |||
+ | clf = svm.SVC() | ||
+ | scores = model_selection.cross_val_score(clf, data, label, cv=5) # 5개의 데이터로 나누어 진행. | ||
+ | </syntaxhighlight> | ||
+ | |} | ||
+ | |||
+ | == 매개변수 찾기. 그리드 서치 == | ||
+ | 각각의 학습방법에 대해 매개변수를 조절해야 할 필요가 있다. 관련된 변수의 최적값을 자동으로 찾아주는 기능. 정답률을 개선시켜준다. | ||
+ | |||
+ | 단지, 시간이 더 오래걸린다. | ||
+ | {| class="wikitable" | ||
+ | !절차 | ||
+ | !설명 | ||
+ | !방법 | ||
+ | |- | ||
+ | |모델 부르기 및 그리드서치 매개변수 설정 | ||
+ | |매개변수의 후보들을 등록한다. | ||
+ | |<syntaxhighlight lang="python"> | ||
+ | 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]} | ||
+ | ] | ||
+ | </syntaxhighlight> | ||
+ | |- | ||
+ | |그리드서치 수행 | ||
+ | |n_jobs는 병렬계산할 프로세스 지정. -1은 자동으로 진행한다는 의미. | ||
+ | |<syntaxhighlight lang="python"> | ||
+ | clf = GridSearchCV(svm.SVC(), params, n_jobs=-1) # 그리드서치 관련내용이 담긴 객체를 생성. | ||
+ | clf.fit(train_data, train_label) # 이 객체를 학습시킨다. | ||
+ | </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로.
의도 | 설명 | 방법 | ||||
---|---|---|---|---|---|---|
훈련데이터와 테스트데이터 분리 | 귀찮은 일을 모듈이 해준다.
|
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)
일반적으로 이 대신 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) # 이 객체를 학습시킨다.
|