머신러닝 간단정리
[목표]
과소적합 : 훈련셋이 적어 성능이 제대로 나오지않는 모델
과대적합 : 너무 상세하고 복잡한 모델링으로 훈련셋만 과도하게 정확한 모델
일반화가 필요함 (일반적으로 데이터의 양이 많으면 일반화에 도움이 됨)
======================================================================
머신러닝 학습유형에 따른 구분
1. 지도학습(= 교사학습) :
문제(입력특성)이 주어지고
답(Label)데이터까지 학습하여 훈련시키는 기법
* 결과값에 따른 구분 : 분류와 회귀
- 분류 : 0, 1 / 'p', 'e' 범주데이터 예측 (카테고리, 클래스)
- 회귀 : 수치적으로 의미가 있는 연속적인 값
* 분류모델 :
KNN (최근접 Target데이터 확인 > 스케일링 필요)
Decision tree (특성에 대해 질문 > 노드)
Random Forest (배깅 = 동일한 트리모델 병렬적으로 모델 구성 >> 각각 학습 )
Adaboost, GMB, XGB (부스팅 : 순차적, 연속적으로 ... )
Logistic_Regression , SVM ( 선형분류모델 LinearModel Classification )
* 분류 모델 성능 지표 :
accuracy (정확도)
recall (재현율)
precision (정밀도)
f1csore(조화평균)
roc곡선
* 회귀모델 :
Liner Regression
SGD Regression
Ridge
Lasso
* 회귀모델 성능지표 :
score = R-Squared = 결정계수 = r2score
mse 평균제곱오차
rmse 제곱근 평균제곱오차
mae 평균절대값오차
2. 비지도학습 :
문제(입력특성)만 주어지고 학습하여
특성의 패턴, 규칙을 파악하는 기법
* 군집화(Clustering) : 데이터 규칙이 비슷한 유형끼리 묶어주는것
- 차원축소 : 특성이 너무 방대할 경우 주요 특성만 의미있게 만드는 방법
3. 준지도 학습 :
라벨이 있는 데이터와 라벨이 없는 데이터
모두 사용하여 학습하는 기법
- 순서 :
라벨이 있는 데이터 모델 학습 >>
학습된 모델에게 라벨이 없는 특성데이터를 예측>>
예측값을 답 데이터로 활용
4. 강화학습 :
환경과 에이전트(행동주체)가 있을때 주체자는
행동에 대한 보상과 패널티를 받으면서
보상을 받는 쪽으로 행동하며 학습해가는 과정
======================================================================
[ 머신러닝 절차]
문제 정의 / 요구사항 분석
(무엇을 예측할것인가? 분류vs회귀? 방향성 설정)
>>
데이터 수집
(크롤링, 공공포털 사이트 다운, db다운 등)
>>
데이터 전처리
(정제/수정/삭제 : 결측치 확인 , 데이터 종류 및 크기 확인, key나 컬럼명 확인 등)
>>
데이터 분석
(시각화 / EDA : 탐색적 데이터 분석 등)
>>
모델 학습 / 예측 / 일반화 성능확인 >>
cross_val_score() 교차 검증이나 GridSearchCV 하이퍼 파라미터 튜닝을 통해 모델성능 향상
(grid 모델링 / 교차검증 및 최적화 하이퍼 파라미터 확인) >>
최적화 모델링후 모델 학습 / 성능확인 / 정확도 예측 /
======================================================================
[주요모듈]
sklearn.model_selection
: 훈련, 테스트 데이터 분리 (train_test_split),
교차검증 (cross_val_score),
그리드 서치 (GridSearchCV)등의 기능 제공
sklearn.metrics
: 성능평가 (accuracy, msem rmse, mae, r2등)
sklearn.preprocessing
: 데이터 전처리 기능
(StandardScaler 등의 스케일링 /
LabelEncoder, OneHotEncoder 등의 인코딩 )
sklearn.ensemble
: Ensemble(앙상블) 알고리즘 기능 제공
(RandomForest, AdaBoost 등)
sklearn.linear_mode
: 회귀관련 알고리즘 제공
(LinearRegression등)
sklearn.neighbors
최근접이웃 알고리즘 제공
( KNeighbors KNN모델 등)
sklearn.tree
의사결정 트리 알고리즘 제공
(DecesionTree등)
======================================================================
1. 문제 정의 / 요구사항 분석
: 무엇을 예측할것인가? 분류vs회귀? 방향성 설정
======================================================================
2. 데이터 수집 (공개데이터 / 크롤링 / db / 설문조사등)
파일 불러오기 :
file = open('파일명', encoding='UTF-8')
csv 파일 형태 불러오기 :
data = pd.read_csv('파일명', encoding = 'UTF-8')
파일을 불러왔을때 컬럼이 많아 ...으로 생략되서 뜰 경우
pd.set_option('display.max_columns', None)
으로 설정을 바꿔준다
======================================================================
3. 데이터 전처리
: 정제/수정/삭제
데이터 확인 (데이터 종류 및 크기 확인, key나 컬럼명 확인, 결측치 확인) /
특성공학(데이터 전처리 과정에서 train에 활용할 좋은 특성을 찾는 것)/
인코딩(데이터 문자 >> 수치) 등의 작업이 진행됨
-------------------------------------------------------------
데이터 값이 딕셔너리 형태라면 (번치타입 객체도 딕셔너리 형태)
data명.keys()
data명.values()
data명.items()
로 불러올 수 있다
----------------------------------------------------------------
데이터의 형태가 numpy 형태의 배열이라면
data명.shape : 몇행 몇열의 배열인지 확인 ->
pandas에서도 동일 사용가능
data명.size : 내부 데이터 전체 개수 확인
data명.ndim : 몇 차원인지 확인
data명.dtype : 데이터가 어떤 자료형인지 확인 (int, float 등등)
np.bincount(data명) : 내부 원소에 대한 빈도수를 확인 ->
pandas에서는 Series명.value_counts()가 같은 기능 (Series 형태에서만 사용가능)
-------------------------------------------------------
데이터의 형태가 pandas형태라면
data명.info()
: 데이터의 총 건 / 타입 / 결측치 / 전체적인 정보 등을 확인한다
-> 컬럼들이 가지고 있는 row의 값이 같은지, non-null인지 등을 통해 결측치 확인
data명.describe()
: 컬럼별 숫자데이터 통계 출력됨
( count 총계, top 가장 많이 나온 요소, min 최소값, mean 평균, max 최대값, freq-top의 횟수 등등의 통계량)
(object형은 출력에서 제외됨)
data명.shape
: 데이터의 행, 열 크기를 튜플로 리턴함
data명.head(숫자)
: 상위 n개의 row 확인하기
data명.columns
: df의 컬럼명 모두 출력
Series명.value_counts()
: 특정 컬럼의 데이터 갯수를 리턴함-> numpy에서는 np.bincount(data명)
(1차원 Series 형태에만 사용 가능 >> 따라서 df형자료형의 컬럼 하나를 불러와서 사용한다)
.unique()
: 해당 컬럼 내부의 유일한 값을 확인 가능하다 / ndarray형태로 리턴
data명.values
: df의 값만 확인
data명.index
: df의 index 모두 출력. ndarray 1차원과 같은 형태로 리턴됨.
---------------------------------------------------------
집계함수 min, max, sum, count 를 모든 컬럼에 적용할 수 있다
df.min()
df.max()
df.sum()
df.count() : null 값을 제외한 각 column의 row 수
df[[ 'col1', 'col2']].mean() : col1의 mean값과 col2의 mean값 출력
해당 집계함수 앞에 group by('기준값')을 붙여주면
해당 기준값을 기준으로 모든 컬럼에 집계함수가 적용된채로 출력된다
(주의점은 groupby를 쓸때는 새로운 변수명에 담아줘야 함)
df_groupby = df.groupby('컬럼1').count()
>> 컬럼1을 기준으로 df 전체 컬럼의 row값을 count
여러 컬럼을 기준으로 하고싶다면
df_groupby = df.groupby( ['컬럼1', '컬럼2'] ).count()
>> 컬럼1과 컬럼2를 기준으로 전체 row 값을 count
전체가 아닌 특정컬럼 값만 집계해서 보고싶다면
df_groupby = df.groujpby('기준컬럼')['특정컬럼']
df_groupby = df.groupby('기준컬럼')[ ['특정컬럼1'] ['특정컬럼2'] ]
여러 개를 확인할때는 [ ] 안에 넣어주는 형식이다
df_groupby = df.groupby(['기준컬럼1','기준컬럼2'])[ ['특정컬럼1', '특정컬럼2'] ]
여러가지 집계함수를 동시에 적용시키고 싶을땐 agg를 이용한다
df_groupby = df.groupby('기준컬럼').agg( [ 'count', 'min', 'max' ] )
---------------------------------------------------------
결측치가 있을경우 재확인하고 결측치를 채워주는 작업이 필요하다
넘파이 데이터의 경우
np.isnan(data명) .sum()
판다스 데이터의 경우
data명.isnull().sum()
으로 결측치 합의 확인이 가능하다.
결측치를 채우는 방법은 등장 빈도수가 높은 값으로 채우기,
관련있는 값으로 채워주기 등이 있으며
fillna(채울값) 으로 내부 결측치를 채울수 있다
빈도수가 높은 값으로 채울때는
넘파이 데이터의 경우
np.bincounts(data명)
판다스 데이터의 경우
Series명.value_counts()
로 단일컬럼의 내부 원소값을 센 후 채워준다
관련있는 값으로 채울때는
data명.corr()
을 이용하여 상관계수 확인이 가능하다
(-1이나 1에 가까울수록 상관도가 높고, 0에 가까울수록 상관도가 낮음)
data명.corr()['특정컬럼명']
이런식으로 특정 컬럼에 대해서만 인덱싱해서 상관관계를 확인가능하며
이 값에 대해 절대값을 보여주는 *.abs()와
값을 기준으로 정렬하는 sort_values()를 이용하면 쉽게 확인이 가능하다
df = df.sort_values( by = [ '특정컬럼명' ], ascending = True, inplace = False)
by를 이용하여 특정컬럼을 기준으로 정렬
여러컬럼이 기준일땐 by = [ '컬럼1' ,컬럼2' ]
이렇게 리스트 형식으로 컬럼명 입력
ascending 이 True일 경우 오름차순 / False 일 경우 내림차순
inplace 가 False일 경우 원본 데이터 유지 / True일경우 원본데이터 정렬
------------------------------------------------------------------
특성추출로 사용할 컬럼을 만들었으면 중복된 컬럼은
*.drop() 함수로 삭제해주며
이때 원본데이터 내용을 바꿔야 하면 내부에 inplace = True 속성을 줘야하고
drop함수의 기본값은 axis = 0 : 가로단위 작업 (row) 이므로
컬럼을 삭제하는 경우 axis = 1 : 세로 단위 작업 (column) 의 속성값도 줘야한다
비슷한 컬럼들은 구분해줄 bins 의리스트와 lables의 리스트를 만들고
pd.cut (컬럼명, bins = ?, labels = ?) 함수를 이용해 묶어주는 bining 작업을 진행해준다
numpy 형태의 값이라면 보기 편하게 DataFrame화 해도 되고,
하지않아도 그대로 머신 러닝은 가능하다.
판다스 객체로 만들경우에는
data명 = pd.DataFrame(data명, columns=컬럼명, index=인덱스명)
으로 생성해준다
혹은 딕셔너리로 생성할경우
dict = { 'col1' : [1,2,3], 'Name' : ['채수민', '최영화', '최태양' ]}
data명 = pd.DataFrame(dict)
key 가 column명으로 , value가 row로 간다
-----------------------------------------------------------------------------
컬럼 내부의 요소가 문자일 경우 이를 수치화해줘야 하는데 이때 인코딩 작업이 필요하다
인코딩은 원핫 인코딩과 레이블인코딩으로 나눠진다
원핫 인코딩 : 값의 크고 작음이 의미없을때 사용 / 0과 1로 채워줌
원핫변수명 = pd.get_dummies(컬럼명)
인코딩 해야할 컬럼이 많을 경우
onehot_col = ['컬럼1', '컬럼2', '컬럼3']
이런식으로 리스트에 담아준 후
for col in onehot_col :
dummy pd.get_dummies( data명[col] )
data명 = pd.concat( [data명, col] , axis = 1)
data명.drop( col, axis = 1, inplace = True)
이렇게 한번에 인코딩 할 수 있다
레이블 인코딩 : 값의 크기에 의미가 있을때 (랭킹 등) 숫자를 매핑해주는 것
col1의 row 값이 a, b, c, d, e, 라면
col1_dict = { 'a' : 1 , 'b' : 2 , 'c' : 3 , 'd' :4 , 'e' :5 }
data['col1'].map(col1_dict)
이런식으로 딕셔너리를 만들어서 문자값을 직접 맵핑해주는 방식이다
======================================================================
4. 데이터 분석 (시각화 / EDA : 탐색적 데이터 분석)
import matplotlib.pyplot as plt
import seaborn as sns
Seaborn : Matplotlib을 기반으로한 시각화 패키지로 그래프를 그리는 기능
hue 옵션으로 bar 구분이 가능하며 라벨을 따로 붙이지않아도 세팅이 됨
컬럼별 데이터의 개수를 확인할떄는 countplot
컬럼에 대한 데이터의 비교 분포를 확인할때는 violinplot
sns.countplot(data = 확인할 자료, x = '컬럼1', hue = '기준컬럼')
plt.show()
sns.violinplot(data = 확인할 자료, x = '컬럼1', y='컬럼2', hue = '기준컬럼', split = True)
plt.show()
======================================================================
5. 모델선택(사용할 머신러닝 모델) 후 모델링
:훈련셋과 테스트 셋으로 분리 / 모델 객체 생성 / 데이터 인코딩 작업 등
from sklearn.model_selection import train_test_split
문제와 답으로 나눠준후 (인덱싱, 슬라이싱, drop등을 이용하여)
해당 데이터를 훈련 셋과 테스트 셋으로 분리한다
문제 : 속성값, 피처, feature, 특성, 컬럼명, 독립변수, X
답 : 레이블, Label, target, 타겟, 종속변수, y
훈련셋 : 학습시키기 위한 데이터 , train
평가셋 : 학습이 잘 됐는지 판별하는 데이터, test
훈련셋과 테스트셋의 비율을 나눠주는 도구 train_test_split
나눠줄 값 들 = train_test_split(문제, 답, test_size=비율, random_state=아무숫자나)
train_test_split(피처 데이터 셋, 라벨 데이터 셋, test_size =값 , random_state = 값 )
(ex)
X_train, X_test , y_train ,y_test = train_test_split(cancer_data.data,
cancer_data.target,
test_size=0.25,
random_state=66)
test_size=0.3 부분이 테스트할 데이터의 비율이며
random_state는 수행할때마다 동일한 결과를 얻기위해 적용하는 부분인데
정렬된 상태의 데이터를 일반화하기 위해 데이터를 섞어주고
이 섞인 데이터의 상태를 고정하기위해 할당하는 것이므로
안의 값은 몇이든 크게 상관없다
보통 7:3의 비율을 많이 사용한다.
이후 사용할 모델에 따른 모델 객체를 생성해준다
[분류]
from sklearn.neighbors import KNeighborsClassifier
from sklearm.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import AdaBoostClassifier
from sklearn.linear_model import LogisticRegression
[회귀]
from sklearn.linear_model import LinearRegression
from sklearn.liner_model import SGDRegressor
from sklearn.linear_model import Ridge
from sklearn.linear_model import Lasso
모델명 = 모델종류Classifier ( 하이퍼파라미터 =? ,random_state=아무숫자)
단 이렇게 나누기만 했을경우에는 과적합에 취약하므로 결국 교차검증등의 작업이 필요함
======================================================================
6(모델 학습, 교차검증) ~7(모델 예측)번은 8번 그리드서치로 생략가능!!!!!!
6. 모델 학습 / 모델 성능 확인
: 교차검증으로 모델의 일반화 성능 확인 , 하이퍼 파라미터 조정하기
하이퍼 파라미터 : 규제 = 사람이 지정하는 매개변수
모델 학습 :
모델명.fit(훈련용 문제, 훈련용 답)
모델의 성능을 평가하는 교차검증 (Cross Validation) : cross_val_score
from sklearn.model_selection import cross_val_score
result = cross_val_score( 예측모델명, X 피처데이터 셋, y 레이블 데이터 셋, scoring = 평가지표, cv = 교차검증횟수)
scoring : 예측성능평가지표 / 정확도 등
7. 모델 예측 후 정확도 평가
from sklearn.metrics import accuracy_score
학습된 모델 예측 :
모델명.predict(테스트용 피처 데이터)
예측은 반드시 학습 데이터가 아닌 다른 데이터를 이용 (보통 테스트 데이터 셋 사용)
모델 정확도 평가 :
accuracy_score(테스트용 답, 예측값)
accuracy_score(실제 레이블 세트, 예측 레이블 세트)
======================================================================
8. GridSearchCV를 이용한 모델 성능 개선 향상시키기
GridSearchCV를 이용하여 사용할 모델에 쓰이는 하이퍼 파라미터를 입력하여 최적의 파라미터 도출
(진행 순서)
from sklearn.model_selection import GridSearchCV
a. GridSearchCv 도구를 불러온 후 튜닝할 매개변수 경우의 수 설정
( = 하이퍼 파라미터 경우의 수 설정하기)
paramas = { '하이퍼 파라미터1' : [값1, 값2, 값3], '하이퍼 파라미터2' : [값1, 값2, 값3], ......}
b. 사용할 모델 선정, 모델 객체 생성
모델 객체 생성 :
모델명 = 사용할모델Classifier(random_state = 아무숫자)
하이퍼 파라미터는 위에서 매개변수 paramas 객체로 생성했으므로 따로 넣지않는다
c. 해당 모델에 GridSearch 설정 연결후 실행하기
grid변수명 = GridSearchCV(모델명, paramas, cv = 교차검증 횟수, scoring = '사용할 평가지표', n_jobs = -1)
a에서 만든 하이퍼 파라미터 경우의 수와 b에서 만든 모델을 grid변수에 연결해준다
d. 모델 학습으로 최적의 하이퍼 파라미터와 최적의 정확도 확인
grid변수명.fit(문제데이터, 답 데이터) : 모델 학습
grid.best_paramas_ : 최적의 하이퍼 파라미터 확인
grid.best_score_ : 최적의 정확도 확인
e. 최적의 파라미터 조합으로 모델링하기
9. 최적화 하이퍼 파라미터, 최적화 정확도로 모델 재학습 시키기
======================================================================
10. 모델 특성 중요도 확인하기
각 피처의 중요도를 확인하는 feature importance
feature_importance_value = 모델명.feature_importances_
feature_importance = pd.Series(feature_importance_value, index = 피쳐 이름을 가진 컬럼 )
feature_top = feature_importance.sort_values(ascending = False) [ : n ]
sns.barplot( x = feature_top, y = feature_top.index)
보통 seaborn 라이브러리를 이용해서 Seires나 DataFrame으로 만든후 시각화함
======================================================================