반응형

 

 

LinearRegression 클래스 - Ordinary Least Squares

: 예측값과 실제값의 RSS(Residual Sum of Squares)를 최소화해서 OLS(Ordinary Least Squares) 추정 방식으로 구현한 클래스

  1. fit() 메서드로 X,y 입력받으면 회귀 계수인 W를 coef_ 속성에 저장
  2. 입력 파라미터
  • fit_intercept : 절편 값을 계산할 것인지 말지 지정 (True or False)
  • normalize : True이면 회귀를 수행하기 전에 입력 데이터 세트를 정규화함
  1. 속성
  • coef_ : 회귀 계수
  • intercept_ : 절편 값
  1. OLS는 입력 피처의 독립성에 많은 영향을 받는다. 피처 간의 상관관계가 매우 높은 경우, 분산이 매우 커져서 오류에 매우 민감해진다.(다중 공선성 문제)

→ 상관관계가 높은 피처가 많은 경우, 독립적인 중요한 피처만 남기고 제거하거나 규제를 적용한다.

→ PCA를 통해 차원 축소를 수행한다.

  1. 회귀 평가 지표
  • MAE
  • MSE
  • RMSE
  • R^2
  1. 사이킷런에서의 평가지표
  • MAE
  • MSE
  • R^2

 

 

다항 회귀의 과대적합/과소적합

다항 회귀

: 단항식이 아닌 2차, 3차 방정식과 같은 다항식으로 표현 되는것

ex) y = w0 + w1 * x1 + w2 * w2 + w3 * x1 * x2 + w5 * x1^2 + w5 * x2^2

  • 다항 회귀는 선형 회귀이다. 선형 / 비선형을 나누는 기준은 회귀계수가 선형 / 비선형인지에 따라 나눈다.

 

  1. PolynomialFeatures 클래스를 통해 피처를 다항식 피처로 변환한다.

 

 

반응형
반응형

 

 

 

1. 회귀 소개

회귀분석 : 데이터 값이 평균과 같은 일정한 값으로 돌아가려는 경향을 이용한 기법

ex) 사람의 키는 평균 키로 회귀하려는 경향을 가지고 있어서 세대가 지날 수록 평균 키가 커지는 것

선형 회귀식 Y = W1X1 + W2X2 + W3X3 + ... WnXn

Y는 종속 변수 , X1,X2, ... Xn 은 독립변수 , W1,W2, ... Wn 은 독립변수 값에 영향을 미치는 회귀계수

→ 머신러닝 회귀 예측의 핵심은 주어진 피처 ( 독립변수 ) 와 결정 값 ( 종속변수 ) 데이터 기반에서 학습을 통해 최적의 회귀계수를 찾아내는 것이다.

 

지도학습 유형

  1. 분류 → 예측값이 이산형 클래스 값(카테고리 같은)
  2. 회귀→ 예측값이 연속형 (숫자값 같은)
  • 선형회귀

회귀중에서 선형 회귀가 가장 많이 사용된다. 선형회귀는 실제 값과 예측 값의 차이 ( 오류의 제곱 값)를 최소화 하는 직선형 회귀선을 최적화하는 방식이다.

  1. 일반 선형 회귀
  2. 릿지
  3. 라쏘
  4. 엘라스틱넷
  5. 로지스틱 회귀

2. 단순 선형 회귀

  • 단순 선형 회귀

→ 독립변수도 하나, 종속변수도 하나인 선형회귀

 

→ 주택 가격이 주택의 크기로만 결정 된다고 할 때!

 

→ 실제 값과 회귀 모델의 차이에 따른 오류 값 : 잔차

→ 최적의 회귀 모델은 전체 데이터의 잔차의 합이 최소가 되는 모델을 만든다는 의미

 

→ 잔차에는 +,- 값이 있기 때문의 절댓값을 취하거나 위사진처럼 제곱의 값을 구해서 더하는 방식 (RSS) 을 취한다.

 

→ 회귀에서 이 RSS 는 비용(cost) 이며, 이 w변수로 구성되는 RSS를 비용함수라고 한다.

비용함수를 손실함수 (loss function) 라고도 하며, 머신러닝 회귀 알고리즘은 데이터를 계속 학습하면서 이 비용 함수가 반환하는 값( 즉, 오류값) 을 지속해서 감소시키고 최종적으로는 더 이상 감소하지 않는 최소의 오류 값을 구하는 것이다.

3. 경사 하강법

경 사 하강법은 W파라피터가 많을 때 '점진적으로' 반복적인 계산을 통해 W 파라미터 값을 업데이트하면서 오류값이 최소가 되는 W파라미터를 구하는 방식

ex) 최초 오류 값이 100이었다면 두 번째 오류 값은 100 보다 작은 90, 세 번째는 80 과 같은 방식으로 지속해서 오류를 감소시키는 방식으로 W 값을 계속 업데이트 → 오류값이 더 이상 작아지지 않으면 그 오류 값을 최소 비용으로 판단하고 그 때의 W 값을 최적 파라미터로 반환

 

→ 미분된 1차함수의 기울기가 감소하지 않는 지점을 비용 함수가 최소인 지점으로 간주하고 그 때의 w 를 반환

 

→ (실제값-예측값)의 제곱의합의 평균을 계산한 후에 w1 에 대해, w0 에 대해 각각 편미분

 

→ 새로운 w1 = 이전 w1 - (w1에서 편미분한 결괏값)

→ 위 편미분 값이 너무 클 수 있기 때문에 보정 계수를 곱한다 =이를 '학습률' 이라한다.

반응형
반응형

 

 

 

<GBM>

부스팅 알고리즘

→1. AdaBoost(Adaptive boosting)

→2. 그래디언트 부스트(GBM)

 

 

  1. AdaBoost

 

개별적인 모델을 순차적으로 학습을 시킬 때, 하나의 모델을 각 한 턴에 학습을 시키고, 각각의턴 마지막에는 오분류된 (회귀오차가 큰) 샘플들을 찾아서 그 것들이 새로운 훈련세트에서는 더 많이 나올 수 있도록 가중치를 부여함. 즉, 앞선 모델에 의해서 나타는 큰 오차는 이어서 학습된 모델이 그 오차를 줄이기 위한 학습을 할 것이므로 줄어들 것이다.

 

  • 첫번째 모델과 가중치, 두번째 모델과 가중치, 세번째 모델과 가중치를 잘 합하면 최종적 분류 경계면 생성!

2. GBM

에이다부스트와 유사하나, 가중치 업데이트를 경사하강법을 이용하는 것이 큰 차이

x1,x2,x3 … 의 피처가 있을 때, 결괏값을 y, 예측함수를 F(x) 라고 한다. 오류 식 y-F(x) 를 최소화하는 방향성을 가지고 반복적으로 가중치 값을 업데이트하는 것이 경사 하강법이다.

GBM 은 과적합에도 강한 뛰어난 예측 성능을 가진 알고리즘이다. 하지만 수행 시간이 오래 걸린다는 단점이 있다.

3.XGBoost

XGBoost는 그래디언트 부스팅머신이다. 보다 빠르게 수행하고자, 스케일 과정에서 병렬처리가 가능하게 하려는 목적이 있다.

  • Approximate algorithm 은 병렬처리가 가능하므로 Basic exact greedy algorithm 보다 빠른 수행

4.LightGBM

위의 부스팅 계열 알고리즘보다 더 빠른 수행 가능

원래의 부스팅은 모든 feature, 모든 data instances 에 대해 추정해야하므로 시간이 오래걸림

Idea

  1. Gradient-basde One-Side Sampling
  • Keep large gradients and randomly drop instances small gradients

실질적으로는 gradients 가 낮은 객체들은 random하게 drop 되므로 모든 객체에대해 수행 X

  1. Exclusive Feature Bundling
  • 하나의 개체에 대해서 두개이상의 변수들이 0이 아닌 값을 동시에 가질 확률이 매우 낮다는 것을 이용

 

 

 

반응형
반응형

 

 

  1. 결정 트리(Decision Tree)

: 데이터에 있는 규칙을 학습하여 자동으로 찾아내 트리 기반의 분류 규칙을 만드는 것

(스무고개와 유사)

  1. 결정 트리 구조
  • 규칙 노드 : 규칙 조건
  • 리프 노드 : 결정된 클래스 값

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/5c7baf52-8c49-4ca2-a939-79bf15369626/.jfif

  1. 결정 트리 분류 기준

: 정보 균일도 ( 가장 비슷한 데이터끼리 분류하는 것이 목표 )

  • 지니 계수 : 낮을수록 균일
  • 정보 이득 : 높을수록 균일

지니 계수가 낮거나 정보 이득이 높은 조건을 찾아 반복적으로 분할한다.

데이터가 모두 특정 분류에 속하게 되면 분할을 멈추고 분류를 결정한다.

  1. 결정 트리 장단점
  • 장점

: '균일도'라는 명확한 기준을 가지고 분류

: 쉽다, 직관적이다.

: 피처의 스케일링이나 정규화 등의 사전 가공 영향도가 크지 않음

  • 단점

: 많은 규칙이 들어가면 과적합으로 이어질 수 있다. → 트리의 크기를 사전에 제한하기

  1. 결정 트리 파라미터
  • min_samples_split : 노드를 분할하기 위한 최소한의 샘플 데이터 수(과적합 방지)
  • min_samples_leaf : 말단 노드가 되기 위한 최소한의 샘플 데이터 수(과적합 방지)
  • max_features : 최대 피처 개수, 디폴트는 모든 피처 사용
  • max_depth : 트리의 최대 깊이
  • max_leaf_nodes : 말단 노드의 최대 개수(과적합 방지)
  1. 결정 트리 모델 시각화
  • Graphviz
  • visualize_boundary()

 

 

 

 

  1. 앙상블 학습

: 여러 개의 분류기를 생성하여 그 예측을 결합함으로써 보다 정확한 최종 예측 도출하는 기법

 

  1. 보팅

: 서로 다른 알고리즘을 가진 분류기를 결합

  1. 배깅

: 같은 유형의 알고리즘 기반이지만, 데이터 샘플링을 서로 다르게

  1. 부트스트래핑

: 개별 classifier 에게 데이터를 샘플링해서 추출하는 방식

: 중복을 허용함

  1. 부스팅

: 여러 개의 분류기가 순차적으로 학습을 수행하되, 앞에서 학습한 분류기가 예측이 틀린 데이터에 대해 올바르게 예측할 수 있도록 다음 분류기에게 가중치 부여

ex) 그래디언트 부스트 , XGBoost, LightGBM

  1. 보팅 유형 - 하드 보팅 vs 소프트 보팅

하드 : 다수결의 원칙과 비슷하게 예측한 결괏값들중 다수의 분류기가 결정한 예측값을 최종 보팅 결괏값으로 선정

소프트 : 분류기들의 레이블 값의 결정 확률을 모두 더하고 이를 평균해서 확률이 가장 높은 레이블 값을 최종 보팅 결괏값으로 선정

 

 

 

  1. 랜덤 포레스트(RandomForest)

: 배깅의 대표적인 알고리즘

: 전체 데이터에서 배깅 방식으로 각자의 데이터를 샘플링해 개별적으로 학습을 수행한 뒤, 최종적으로 모든 분류기가 보팅을 통해 예측 결정을 함

  1. 랜덤 포레스트의 파라미터
  • n_estimators : 결정 트리의 개수
  • max_features : 결정 트리와 동일, 단 디폴트가 전체 피처가 아님
  • max_depth : 결정 트리와 동일
  • min_samples_leaf : 결정 트리와 동일
  1. GridSearchCV
반응형
반응형

 

오차 행렬

불균형한 레이블 데이터 세트에서 예측할 때 발생할 수 있는 한계점을 극복하기 위한 방법 중 하나

 

위 네개의 값을 조합해 Classifier의 성능을 측정할 수 있는 주요 지표인 정확도(Accuracy), 정밀도(Precision), 재현율(Recall) 값을 알 수 있다.

  • 정확도 = 예측 결과와 실제 값이 동일한 건수 / 전체 데이터 수 (TN + TP) / (TN + FP + FN + TP)
  • 정밀도 = 예측을 P로 한 대상중에 예측과 실제값이 P로 일치한 데이터의 비율 TP / (FP + TP)
  • 재현율 = 실제 값이 P인 대상 중에 예측과 실제 값이 P로 일치한 데이터의 비율 TP / (FN + TP)

분류하려는 업무의 특성상 정밀도 또는 재현율이 특별히 강조돼야 할 경우, 분류의 결정 임곗값을 조정해 정밀도 또는 재현율의 수치를 높일 수 있다.

그러나 둘은 상호 보완적인 지표기 때문에 어느 한쪽을 강제로 높이면 다른 하나의 수치는 떨어지기 쉽다.

일반적으로 이진 분류에서는 예측의 임곗값을 50%로 정한다.

그러나 임계값을 떨어트리면 정밀도는 떨어지고 재현율이 올라간다.

아래는 임곗값 변화에 따른 평가 지표이다.

 

F1 스코어

정밀도와 재현율을 결합한 지표

 

recall = 재현율

precision = 정밀도

ROC 곡선과 AUC

ROC 곡선 (Receiver Operation Characteristic Curve)은 FPR(False Positive Rate)이 변할 때 TPR(True Positive Rate, 재현율/민감도)이 어떻게 변하는지를 나타내는 곡선

TNR = TN / (FP + TN)

FPR = FP / (FP + TN) = 1 - TNR = 1 - 특이성

 

ROC 곡선이 가운데 직선에 가까워질수록 성능이 떨어지는 것

분류 결정 임곗값을 이용하여 FPR을 0부터 1까지 변경하며 TPR의 변화 값을 구함으로써 ROC 곡선을 구할 수 있다.

ex) FPR을 0으로 만들려면 임곗값을 1로 지정

roc_curve() API 이용

 

 

 

 

 

 

 

 

 

 

반응형
반응형

 

 

 

IoC란 Inversion of Control의 줄임말로 한글로 번역하면 제어의 역전이라는 말이다.

"제어의 역전" 이라는 의미는 말 그대로 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라,

외부에서 결정되는 것을 의미한다.

 

제어의 역전 개념은 이미 폭넓게 적용되어 있다. 일반적으로 자바 프로그램은 main() 메소드에서 시작해서

개발자가 미리 정한 순서를 따라 객체가 생성되고 실행된다.

그런데 서블릿을 생각해보자. 서블릿을 개발해서 서버에 배포할 수는 있지만, 배포하고 나서는 개발자가

직접 제어할 수 있는 방법은 없다. 대신 서블릿에 대한 제어 권한을 가진 컨테이너가 적절한 시점에

서블릿 클래스의 객체를 만들고 그 안의 메소드를 호출한다.

 

이 방식은 대부분의 프레임워크에서 사용하는 방법으로,

개발자는 필요한 부분을 개발해서 끼워 넣기의 형태로 개발하고 실행하게 된다.

프레임워크가 이러한 구조를 가지기 때문에, 개발자는 프레임워크에 필요한 부품을 개발하고,

조립하는 방식의 개발을 하게 된다.

이렇게 조립된 코드의 최종 호출은 개발자에 의해서 제어되는 것이 아니라,

프레임워크의 내부에서 결정된 대로 이뤄지게 되는데, 이러한 현상을 "제어의 역전"이라고 표현한다.

 

스프링은 그 자체가 "구조를 설계할 수 있도록 만들어졌다" 라는 뜻이다. 

 

대부분 프레임워크에서 IoC를 적용한다. 때문에 스프링을 IoC 컨테이너라고만 해서는 스프링을 정확히 정의할 수 없다.

스프링이 여타 프레임워크와 차별화돼서 제공해주는 기능은 의존관계 주입이라는 새로운 용어를 사용할 때

분명히 들어난다.

 

 

1. Spring container


- Java 객체("bean")들의 life-cycle 관리

- DI 

DI란 Dependency Injection의 줄임말로 한글로 번역하면 의존성 주입이라는 말이다.

"의존성 주입"은 제어의 역행이 일어날 때 스프링이 내부에 있는 객체들간의 관계를 관리할 때 사용하는 기법이다.

자바에서는 일반적으로 인터페이스를 이용해서 의존적인 객체의 관계를 최대한 유연하게 처리할 수 있도록 한다.

 

의존성 주입은 말 그대로 의존적인 객체를 직접 생성하거나 제어하는 것이 아니라, 

특정 객체에 필요한 객체를 외부에서 결정해서 연결시키는 것을 의미한다.

즉, 우리는 클래스의 기능을 추상적으로 묶어둔 인터페이스를 갖다 쓰면 되는 것이다.

나머지는 스프링에서 객체를 주입해주기 때문이다.

따라서 이러한 의존성 주입으로 인해 모듈 간의 결합도가 낮아지고 유연성이 높아진다.

 

 

 

* container 종류

1) beanFactory interface 구현체

: getBean(String name, Class <T> requiredType)

2) ApplicationContext interface 및 그 sub-interface 구현체

: BeanFactory를 확장하여 다양한 부가 기능 제공

-> Annotation 기반 설정, Java code 기반 설정, 웹 애플리케이션 관련 기능, 트랜잭션 처리, 메시지 처리 등

 

 

 

 

 

 

 

GenericXmlApplicationContext : XML file 을 설정 정보로 사용

AnnotationConfigApplicationContext : @Configuration이 적용된 java class 의 설정 정보를 이용

XmlWebApplicationContext /  AnnotationConfigWebApplicationContext : Spring MVC framework에서 사용

ex)

 

 

 

 

 

 

2. 의존 관계 설정 (DI)


1) 생성자 방식 : 가장 근접한 타입의 인자를 가진 생성자를 선택

* <Value>를 통해 전달된 값은 기본적으로 String 으로 간주

 

* "c" namespace를 이용한 설정

: 순서가 중요 !

 

 

2) Setter method

 

 

 

: name을 필드이름과 동일하게 설정하기 때문에 순서를 바꿔도 상관없다.

 

* "p" namespace 를 이용한 설정

 

 

 

 

 

3. 생성자 방식 vs Setter 방식


생성자 방식

: Bean 객체를 생성하는 시점에 모든 의존 객체가 주입됨

: 성능상 유리하고, 객체를 사용하기 전에 필요한 의존 객체가 모두 주입된 상태이므로 NullPointException 가능성이 낮음

단, 생성자가 많은 경우 순서대로 객체를 전달하기 때문에 헷갈릴수있다.

 

Setter method 방식

: 각 필드마다 필요한 의존 객체를 주입하므로 설정이 명확하고 용이함

:  setter 별로 실행되므로 성능이 다소 저하되고, setter 실행이 누락된 경우 NullPointException 발생 가능

 

 

 

 

 

4. Lookup method Injection


 

 

4. Collection Wiring


Bean Property가 Collection type인 경우

 

 

 

원소 정의 :

* <value type="java.lang.Double">1.5</value> 이런 식으로 속성 지정 가능

 

 

: Bean property가 generic type으로 선언되 경우, 값이 자동으로 변환됨 !

 

 

 

예시) Collection type

 

-> java 파일에서 Collection, List, 배열 타입으로 선언된 경우 사용 가능

 

-> java 파일에서 Collection, 배열 타입으로 선언된 경우 사용 가능

-> 중복 제거

 

 

 

예시) Map type

 

 

 

 

 

* Properties 는 key와 value가 모두 String인 Map과 같음

 

 

 

 

 

 

5. SpEL


Spring Expression Language

형식 : #{...}

 

** value-ref 가 아닌 value 속성을 사용한다 !!

** 해당 값이 private이면 getSong()을 호출해야 하며, getter 가 존재해야 한다.

 

 

 

* T() : 클래스 이름을 인자로 지정

 

 

 

 

 

# 출처

https://jobc.tistory.com/30

반응형

+ Recent posts