새로운 특성을 추가할 때나 고차원 데이터셋을 사용할 때.
가장 유용한 특성만 선택하고 나머지는 무시해서 특성의 수를 줄이는 것이 좋다.
모델이 간단해지고 일반화 성능이 올라간다.
지도 학습 방법만 가능.
train, test로 나눈 다음 train만 특성 선택에 사용.
1. 일변량 통계
- 개개의 특성과 타깃 사이에 중요한 통계적 관계가 있는지를 계산
- 각 특성이 독립적으로 분산분석을 실시
import pandas as pd
# 데이터셋 가져오기
data = pd.read_csv('경로/파일이름.csv', index_col='인덱스로 사용할 컬럼이름')
# 데이터셋, X와 y로 나눠주기
y = pd.DataFrame(data['타겟 컬럼이름'])
X = data.drop('타겟 컬럼이름', axis=1)
from sklearn.feature_selection import SelectPercentile, f_classif
# 고정된 난수를 발생시킴
rng = np.random.RandomState(42)
# normal분포에서 50개 노이즈 생성
noise = rng.normal(size=(len(X), 50))
# 데이터에 노이즈 특성 추가
X_w_noise = np.hstack([X, noise])
# train과 test로 나눠주기
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_w_noise, y, random_state=고정시드값, test_size=.5)
# f_classif(기본값)와 SelectPercentile을 사용하여 특성의 50%를 선택
select = SelectPercentile(score_func=f_classif, percentile=50)
select.fit(X_train, y_train)
# 훈련 세트에 적용하기
X_train_selected = select.transform(X_train)
# 선택되는 특성 시각화
mask = select.get_support()
print(mask)
# True는 검은색, False는 흰색으로 마스킹
plt.matshow(mask.reshape(1, -1), cmap='gray_r')
plt.xlabel("특성 번호")
plt.yticks([0])
2. 모델 기반 특성 선택
- 특성 선택에 사용하는 지도 학습 모델은 최종적으로 사용할 지도 학습 모델과 같을 필요 없음.
- 모든 특성의 상호작용 부분을 반영.
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(X, y, random_state=고정시드값)
# 랜덤포레스트 기반 특성 선택
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestClassifier
# SelectFromModel : 중요도가 지정한 임계치보다 큰 모든 특성을 선택
# 절반 가량의 특성이 선택될 수 있도록 중간 값을 임계치로 사용
select = SelectFromModel(RandomForestClassifier(n_estimators=100, random_state=42), threshold="median")
select.fit(X_train, y_train)
# 훈련 세트에 적용하기
X_train_l1 = select.transform(X_train)
# 선택되는 특성 시각화
mask = select.get_support()
print(mask)
# True는 검은색, False는 흰색으로 마스킹
plt.matshow(mask.reshape(1, -1), cmap='gray_r')
plt.xlabel("특성 번호")
plt.yticks([0])
3. 반복적 특성 선택
- 방법 1 : 특성을 하나도 선택하지 않은 상태로 시작해서 어떤 종료 조건에 도달할 때까지 하나씩 추가
- 방법 2 : 모든 특성을 가지고 시작해서 어떤 종료 조건이 될 때까지 특성을 하나씩 제거(RFE, 재귀적 특성제거)
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(X, y, random_state=고정시드값)
# 랜덤포레스트 기반 특성 선택
from sklearn.feature_selection import RFE
select = RFE(RandomForestClassifier(n_estimators=100, random_state=42), n_features_to_select=40)
select.fit(X_train, y_train)
# 훈련 세트에 적용하기
X_train_rfe = select.transform(X_train)
# 선택되는 특성 시각화
mask = select.get_support()
print(mask)
# True는 검은색, False는 흰색으로 마스킹
plt.matshow(mask.reshape(1, -1), cmap='gray_r')
plt.xlabel("특성 번호")
'Programming > Machine Learning' 카테고리의 다른 글
그리드 서치 (0) | 2020.02.16 |
---|---|
k-겹 교차검증 (0) | 2020.02.16 |
스케일 조정 (0) | 2020.02.15 |
머신러닝 모델 - 간단한 요약 (0) | 2020.02.15 |
결정 트리 (0) | 2020.02.15 |