1. 선형회귀
- 최소제곱법 (OLS, ordinary least squares)
- 가장 간단, 가장 오래된 회귀용 선형 알고리즘
- 훈련 세트의 타깃 y와 예측 사이의 평균제곱오차 (mean squared error)를 최소화하는 파라미터 w와 b를 찾음
import pandas as pd
# 데이터셋 가져오기
data = pd.read_csv('경로/파일이름.csv', index_col='인덱스로 사용할 컬럼이름')
# 데이터셋, X와 y로 나눠주기
y = pd.DataFrame(data['타겟 컬럼이름'])
X = data.drop('타겟 컬럼이름', axis=1)
# train과 test로 나눠주기
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(2차원 데이터프레임X, 1차원 데이터프레임y, random_state=고정시드value)
# 선형 회귀
from sklearn.linear_model import LinearRegression
lr =LinearRegression().fit(X_train, y_train)
lr.score(X_test, y_test)
# 가중치(계수) w 파라미터 확인
print(lr.coef_)
# 절편(편향) b 파라미터 확인
print(lr.intercept_)
# coef_와 intercept_ 뒤의 밑줄 : scikit-learn은 훈련데이터에서 유도된 속성은 항상 끝에 밑줄을 붙임
# 사용자가 지정한 매개변수와 구분하기 위함.
2. 리지(Ridge) 회귀
- 가중치(w)를 0으로 가깝게 만드는 것
- 모든 특성이 출력에 주는 영향을 최소한으로 만드는 것 (기울기를 작게 한다.)
- L2 규제 : 과대적합이 되지 않도록 모델을 강제로 제한
import pandas as pd
# 데이터셋 가져오기
data = pd.read_csv('경로/파일이름.csv', index_col='인덱스로 사용할 컬럼이름')
# 데이터셋, X와 y로 나눠주기
y = pd.DataFrame(data['타겟 컬럼이름'])
X = data.drop('타겟 컬럼이름', axis=1)
# train과 test로 나눠주기
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(2차원 데이터프레임X, 1차원 데이터프레임y, random_state=고정시드value)
# 리지 회귀
from sklearn.linear_model import Ridge
ridge = Ridge(alpha=10).fit(X_train, y_train)
ridge.score(X_test, y_test)
# 기본값 alpha=1.0
# 값을 높일 수록 제약을 더하면서 일반화
# 값을 줄일 수록 제약이 풀리면서 LinearRegression 모델과 같아져감
3. 라소 (Lasso) 회귀
- Ridge의 대안
- L1 규제 : 계수를 L1 규제처럼 0으로 가깝게 하고 어떤 계수는 0을 만들어버림
- 모델에서 완전히 제외되는 특성이 생긴다.
- 특성 선택이 자동으로 이뤄지고 모델의 가장 중요한 특성을 이해하게 한다.
import pandas as pd
# 데이터셋 가져오기
data = pd.read_csv('경로/파일이름.csv', index_col='인덱스로 사용할 컬럼이름')
# 데이터셋, X와 y로 나눠주기
y = pd.DataFrame(data['타겟 컬럼이름'])
X = data.drop('타겟 컬럼이름', axis=1)
# train과 test로 나눠주기
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(2차원 데이터프레임X, 1차원 데이터프레임y, random_state=고정시드value)
# 라소 회귀
from sklearn.linear_model import Lasso
lasso =Lass(alpha=0.01, max_iter=100000).fit(X_train, y_train)
lasso.score(X_test, y_test)
# alpha : 계수를 강하게 0으로 보내는 정도
# 값이 작을 수록 복잡도 증가, 과소 적합을 줄임, 성능 좋아짐
# 값이 너무 낮아지면 규제 효과가 없어져 과대적합, LinearRegression의 결과와 비슷해짐
# max_iter(반복 실행하는 최대횟수)의 기본값을 늘려야 함
# 사용한 특성 개수 확인
print(np.sum(lasso.coef_ !=0))
일반적으로 리지 회귀 사용
특성이 많고 그 중 일부분만 중요할 경우 라소 회귀사용
4. 분류용 선형모델 - 로지스틱 회귀
- L2 규제
- C : 규제의 강도를 결정, 값이 높아지면 규제 감소
import pandas as pd
# 데이터셋 가져오기
data = pd.read_csv('경로/파일이름.csv', index_col='인덱스로 사용할 컬럼이름')
# 데이터셋, X와 y로 나눠주기
y = pd.DataFrame(data['타겟 컬럼이름'])
X = data.drop('타겟 컬럼이름', axis=1)
# train과 test로 나눠주기
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(2차원 데이터프레임X, 1차원 데이터프레임y, random_state=고정시드value)
# 선형 회귀
from sklearn.linear_model import LogisticRegression
logreg =LogisticRegression(C=100).fit(X_train, y_train)
logreg.score(X_test, y_test)
# 기본값 C=1
5. 분류용 선형모델 - 서포트 벡터머신
- L2 규제
import pandas as pd
# 데이터셋 가져오기
data = pd.read_csv('경로/파일이름.csv', index_col='인덱스로 사용할 컬럼이름')
# 데이터셋, X와 y로 나눠주기
y = pd.DataFrame(data['타겟 컬럼이름'])
X = data.drop('타겟 컬럼이름', axis=1)
# train과 test로 나눠주기
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(2차원 데이터프레임X, 1차원 데이터프레임y, random_state=고정시드value)
# 선형 회귀
from sklearn.svm import LinearSVC
linear_svm =LinearSVC().fit(X_train, y_train)
linear_svm.score(X_test, y_test)
선형 모델의 장점
- 학습 속도가 빠름
- 예측이 빠름
- 매우 큰 데이터셋, 희소한 데이터셋 잘 작동
- 샘플에 비해 특성이 많을 때 잘 작동
선형 모델의 주요 매개 변수
매개변수 (보통 로그 스케일(10배 단위 자릿수 변경)로 최적치를 정함)
- 회귀 모델 : alpha (값이 클수록 모델 단순)
- 분류 모델 : C (값이 작을 수록 모델 단순)
L1 규제와 L2 규제 중 선택
- L1 규제 : 중요한 특성이 많지 않다고 판단
- L2 규제 : 기본적으로 사용
'Programming > Machine Learning' 카테고리의 다른 글
머신러닝 모델 - 간단한 요약 (0) | 2020.02.15 |
---|---|
결정 트리 (0) | 2020.02.15 |
K-NN 분류 알고리즘 (0) | 2020.02.14 |
Data sets 개략적 파악 (0) | 2020.02.11 |
컬럼 결합 / 삭제 / 정리하기 (0) | 2020.02.11 |