기본 콘텐츠로 건너뛰기

令和5年5月3日気になるニュース

yahooニュース 産経新聞、首相「腹を割って意見交換」 7、8日に訪韓し尹大統領と会談  岸田文雄首相は1日(日本時間2日)、7~8日の日程で韓国を訪問し、尹錫悦(ユン・ソンニョル)大統領と会談する方向で調整(ちょうせい)していると明らかにした。訪問先(ほうもんさき)のガーナで記者団の取材に答えた。首相は尹氏が3月に来日(らいにち)した際(さい)、首脳同士が相互(そうご)に訪問する「シャトル外交」の再開(さいかい)で合意(ごうい)しており、その第1弾(いちだん)となる。 続いて、日本政府は4月28日に韓国を輸出手続き簡略化などの優遇措置の対象国となる「グループA(旧ホワイト国)」に再指定(さいしてい)する方針を発表したが、首相の訪韓(ほうかん)で成果(せいか)を示(しめ)せるかが焦点(しょうてん)になると書いていました。 日韓関係が改善されているようでうれしい記事でした。

AFML Chapter 4. Class Weights

 표본 가중값(시간 감쇠 등)과 함께 클래스 가중값을 적용하는 것이 유용할 때가 있다. 클래스 가중값을 과소 출현한 레이블의 가중값을 교정하는 것이다. 이는 빈도수가 과소출현된 Label에게 클래스 가중값을 주는 것이다.

금융시장의 참여자들에게는 과거의 시장 충격에 대한 기억을 가지고 있다. 실제로 시장 참여자들은 투자를 집행할 때에 과거의 충격에 대해 어느정도 큰 영향을 받는다. 2008년 금융 위기를 생각해 보자. 거래소가 탄생한 이후로 2008년 금융위기, 1929년 대공황과 같은 사태는 정말 드물게 일어난다. 

이러한 희소한 레이블에 다른 이벤트와 동일한 가중값을 부여하면 머신러닝 알고리즘은 이러한 이벤트들을 제외하고 학습시킬 것이며, 단지 outlier처럼 취급할 것이다.

Machine Learning 에서의 Class weight 조절

데이터 과학에서도 희소한 Class들의 처리 방법은 이미 오래전부터 이뤄져 온 주제이다. 대표적인 예가 바로 Unbalanced Data인데, 표본 추출된 집단에서 어느 한 집단이 과소 대표된 것을 의미한다. 예를 들어 보자. 사회 전체적으로 보면 남성과 여성의 성비는 거의 1:1에 가깝다. 어느 설문조사가 표집을 잘못하여 남성과 여성의 비율을 8:2로 추출하였다고 하면, 이는 남성과 여성이 각각 과대표집, 과소표집 된 것이다.
이러한 unbalanced data는 ML 분류기에서 큰 착각을 불러일으킨다. 성별 예측의 문제가 주어졌다고 가정하면, 기계는 단지 아무런 특성을 보지 않고 남성이라고 답하는 것만으로도 80%의 정확도를 가지는 분류기를 만들어낸다. 극단적인 예로, 99:1의 비율을 가지고 있다고 하면 1은 단지 Outlier로 처리하여, 99%정확도를 갖는 '그럴듯한' 분류기를 만들어 낼지도 모른다.

그러나, 다행히도 Machine Learning 라이브러리에서는 대개 클래스의 가중치를 다룰 수 있는 기능이 탑재되어 있다. 예를 들어, sklearn은 표본 class[j], $j = 1, ..., J$에서의 1이 아니라 가중치 class_weight[j]를 부여해 오차를 교정한다. 이와 마찬가지로 더 높은 클래스 가중값을 label j에 주면 알고리즘이 j에 대해 더 높은 정호가도를 갖게 될 것이다. 클래스 가중값의 전체 합이 J가 되지 않을 때, 그 효과는 분류기의 규제화 변수를 변경하는것과 같다.

Random Forest

금융에 적용함에 있어 분류기 알고리즘의 표준 Label은 {-1, 1}이며, 0인 경우에는 중립 임계값인 0.5보다 약간 높거나 약간 낮은 확률로 예측되었다는 뜻이 내포되어 있다.
다른 클래스에 비해 하나의 클래스에 대한 더 높은 정확도를 선호해야 할 이유가 없으므로 이런 경우 좋은 기본값 설정 방법은 class_weight = 'balanced'로 두는 것이다.
이 선택은, 관측값에 가중값을 다시 부여하여 모든 클래스가 동일한 빈도로 나타나도록 한다. 즉, class집단이 동일한 비율로 구성되도록 가중치를 조절한다는 뜻이다.

Bagging Classifier

Bagging Algorithm에서는 Argument가 약간 다를 뿐 동일한 기능을 한다. class_weight = 'balanced_subsample'로 할 수 있는데, class_weight = 'balanced'가 전체 데이터셋이 아닌 In bag Bootstrap Sample에 적용된다는 의미이다. 

댓글

이 블로그의 인기 게시물

Random Forest 파헤치기

Random Forest Random Forest Random Forest는 weak Learner로 Decision Tree를 이용하는 일종의 bagging Algorithm이다. (배깅 학습기라는 뜻은 아니다) Machine Learning 분야에서 Support Vector Machine과 같이 가장 많이 사용하는 분류모형 중 하나이다. Random Forest Class는 다음 특징을 가진다. Keyword Argument의 대부분은 DecisionTreeClassifier와 같다. Random Forest에서 Tree의 수가 많아질수록 예측에 유리하지만 시간이 많이 걸리고, 한계적인 이득은 체감한다. Random Forest의 Base Model로는 보통 Deep Tree를 많이 사용한다. Shallow tree는 상대적으로 분산이 작지만 상당한 편의를 발생시킨다. 반면 Deep Tree는 분산이 큰 반면 편의가 작으므로 여러 결과의 평균을 예측에 사용하면 분산을 줄이는 효과가 있다. Random Features Random Forest는 훈련 과정에서 무작위로 추출한 Feature Set만을 사용한다. 이는 모형들 사이의 Correlation을 감소시킨다 Missing Value와 관련된 문제를 효과적으로 완화시킨다. 오늘은 Random Forest와 Decision Tree의 기본 구조를 알고 있다고 가정하고 Keyword Argument 중 중요한 것들을 중심으로 소개하고자 한다. class_weight {class_label:weight} 형식의 클래스와 연결된 가중치이다. 만약 주어지지 않는다면, 모든 Class는 하나의 가중치로 되어 있다. 다중 출력 문제의 경우 dict 목록을 y 열과 같은 순서로 제공할 수 있다. 다중 출력(다중 레이블 포함)의 경우 자체 dict의 모든 열의 각 클래스에 대해 가중치를 정의해야 한다. 예를 들어 4개 클래스의 다중 레이블 분류 가중치는 [{1:1}, {2:5}, {3:1}, {4:1} 대신 [{0:1,

Team Q Research

  Q research Naver blog Qraft에 계신 선배님과 서강대학교 학부생이 함께 만든 퀀트 리서치 팀입니다. 주로 Machine Learning과 Quantitative Finance 분야를 다루며, 최근 연구 분야는 ML분류기에서 나온 Accuracy를 확률로써 해석하기 위해 Probability Calibration을 통해 보정하고, Bet size를 정하는 Secondary Model로써 활용하는 것을 연구중입니다. 이외에도 Machine Learning 분류기와 Neural Network를 사용하여 투자 집행에 도움이 되는 실전 전략 연구를 수행하고 있습니다.

Portfolio Analysis, Mean Variance Frontier

  포트폴리오 이론에서의 기대수익률     포트폴리오 기대수익률은 개별 자산의 기대수익률의 가중치를 고려하여 만든 포트폴리오의 기대수익률이다 mean - variance space     자산 투자에 있어서 기대수익률을 위해서는 투자의 리스크를 감수해야 한다. 즉, 위험 한 단위가 증가할 때 기대수익률 또한 증가한다. Indifference Curve     Risk Averse의 성향이 많은 개인 투자자는 위험에 대해 기피하는 경향이 있다. 따라서, 위험 한 단위가 증가할 때마다 기대수익률을 더 많이 받으려고 하는 경향을 보인다. 따라서 무차별 곡선은 우상향하며, 기울기는 체증한다. 반면, Risk lover의 Indifference Cuve의 기울기는 체감한다. Portfolio Risk     포트폴리오의 리스크는 각 자산의 기대수익률간의 편차로 계산한다.  Example     2000년 1월부터 2020년 12월까지 기간동안 고려한 자산은 다음과 같다 스페인 국채 10년물  KOSPI 주가지수 S&P 주가지수 원유 선물 천연가스 선물 금 선물 구리 선물 import numpy as np import pandas as pd import matplotlib.pyplot as plt % matplotlib inline csv data의 변수명은 다음과 같이 정의한다 data : 수익률 데이터 cycle : 경기순환 사이클 데이터  import한 데이터는 다음과 같이 세가지 형식으로 분류한다 df = pd . concat ([ data . iloc [:, 1 :], cycle . iloc [:, 1 :]], axis = 1 ) # 전체 데이터 df_up = df [ df . cycle == 1 ] # 경기 확장기의 데이터 df_down = df [ df . cycle == 0 ] # 경기 후퇴기의 데이터 noa = len ( df . columns [: - 1 ]) # 포트폴리오 구성자산의 갯수