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

Pywiki
둘러보기로 가기 검색하러 가기
잔글
58번째 줄: 58번째 줄:
 
!설명
 
!설명
 
|-
 
|-
|결측치 채우기
+
|DataFrame을 사용하는 경우
|<syntaxhighlight lang="python">
+
|[[결측치 다루기:pandas]] 문서를 참고하자.
from sklearn.impute import SimpleImputer
 
 
 
imputer = SimpleImputer()
 
imputed_train_X = pd.DataFrame(imputer.fit_transform(train_X))  # 학습용 자료에 결측치 채워넣기.
 
test_train_X = pd.DataFrame(imputer.transform(test_X))  # 테스트용 데이터에 결측치 채워넣기.(위에서 사용하는 메서드와 다르다. 무슨 차이일까..)
 
 
 
</syntaxhighlight>결측치를 채우는 것만으로도 정밀도가 올라가는 경우가 많다.
 
SimpleImputer(strategy='median')
 
 
|}
 
|}
 
= 모델 검증 =
 
= 모델 검증 =

2023년 2월 1일 (수) 13:08 판

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)
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)  # 이 객체를 학습시킨다.