| 단순 | simple | 독립변수(X)가 1개 |
| 다중 | multiple | 독립변수(X)가 2개 이상 |
| 일변량 | univariate | 종속변수(Y)가 1개 |
| 이변량 | bivariate | 종속변수(Y)가 2개 |
| 다변량 | multivariate | 종속변수(Y)가 2개 이상 |
연속형 특성 vs 번주형 특성
원 핫 인코딩
: 범주형 변수 표현
value_counts() : 유일한 값이 각각 몇번 나오는지 출력
get_dummies()로 쉽게 인코딩 가능
print('original feature\n', list(data.columns))
data_dummies = pd.get_dummies(data)
print('\n\n\nchanged feature\n', list(data_dummies.columns))
get_dummies는 연속형 특성은 그대로
values로 numpy로 변환후 train과 target 값 나누기
from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder(sparse=False)
ohe.fit_transform(demo_df)
OneHotEncoder는 모두 범주형이라고 가정함 -> ColumnTransformer 클래스가 필요함 (연속형과 범주형은 매우 다른 전처리를 사용하기 때문에 )
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler
ct = ColumnTransformer(
[('scaling', StandardScaler(),['age','hours-per-week']),
('onehot', OneHotEncoder(sparse=False),
['workclass','education','gender','occupation'])])
ct
data_features = data.drop('income', axis=1)
X_train, X_test, y_train, y_test = train_test_split(data_features,data.income,random_state=0)
ct.fit(X_train)
X_train_trans= ct.transform(X_train)
print(X_train_trans.shape)
print(type(X_train_trans))
train_test_split에 dataframe 전달 가능
구간분할
from sklearn.preprocessing import KBinsDiscretizer
kb = KBinsDiscretizer(n_bins=10, strategy='uniform')
kb.fit(X)
kb.bin_edges_
kb = KBinsDiscretizer(n_bins=10, strategy='uniform', encode='onehot-dense')
kb.fit(X)
X_binned = kb.transform(X)
line_binned = kb.transform(line)
트리모델은 구간을 나누는것이 이득이 없음
일부특성과 출력이 비선형관계이지만 용량이 매우 크고 고차원 데이터셋이라 선형모델을 사용해야한다면 구간분할이 좋은 방법임
상호작용과 다항식
특성을 풍부하게 나타내줌
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=10, include_bias=True)
poly.fit(X)
X_poly = poly.transform(X)
poly.get_feature_names()
상호작용과 다항식은 선형모델의 성능을 크게 높여줌 하지만 복잡한 모델은 아님
대부분의 모델은 각 특성이 정규분포와 비슷할 떄 최고의 성능을 냄
log나 exp함수를 써보자
X_train_log = np.log(X_train+1)
X_test_log = np.log(X_test+1)
이러한 변화는 선형 모델에서는 필수고 트리기반 모델은 불필요함
구간분할, 다항식, 상호작용은 덜 복잡한 모델일수록 좋고 반면 트리기반 모델은 스스로 중요한 상호작용을 찾아낼 수 있고 데이터를 명시적으로 변환하지 않아도 됨
특성 자동 선택
특성을 추가하면 모델은 복잡해지고 과대적합될 가능성 높음
일변량 통계, 모델기반 선택, 반복적 선택
모두 지도학습이라 타깃값이 필요함
하지만 훈련데이터에만 특성 선택사용
일변량 통계
개개의 특성과 타깃 사이에 중요한 통계적 관계가 있는지 계산
분산분석(ANOVA) : 데이터를 클래스별로 나누어 평균을 비교하는 방법
핵심은 일변량 : 즉 각 특성이 독립적으로 평가되기 때문에 다른 특성과 깊게 연관된 특성은 선택안됨
또한 모델을 만들 필요 없음
분류에서는 f_classif, 회귀에서는 f_regression 사용해서 테스트
계산한 p_value에 기초하여 매우 높은 값을 가진 특성을 제외함. == 클래스들의 평균이 같다는 가설을 세울 때 p-value는 가설을 지지하는 확률을 나타내는 것으로 p-value가 큰 특성은 클래스들의 평균이 비슷하므로 타깃에 미치는 영향이 적다고 판단
SelectKBest는 고정된 k개 특성을 선택하고
SelectPercentile은 지정된 비율만큼 특성을 선택함
from sklearn.feature_selection import SelectPercentile, f_classif
select = SelectPercentile(score_func=f_classif, percentile=50)
select.fit(X_train, y_train)
X_train_selected = select.transform(X_train)
print(X_train.shape)
print(X_train_selected.shape)
모델기반 선택
상호작용 부분 고려함
from sklearn.feature_selection import SelectFromModel
select = SelectFromModel(
RandomForestClassifier(n_estimators=100, random_state=40), threshold='median')
select.fit(X_train, y_train)
X_train_l1 = select.transform(X_train)
print(X_train.shape)
print(X_train_l1.shape)
X_test_l1 = select.transform(X_test)
score = LogisticRegression(max_iter=5000).fit(X_train_l1, y_train).score(X_test_l1, y_test)
score
지정한 임계치보다 큰 모든 특성 선택
일변량 분석보다는 강력한 방법
반복적 선택
RFE : 모든 특성으로 시작해서 모델을 만들고 특성 중요도가 낮은 특성을 제거
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)
X_test_rfe = select.transform(X_test)
랜덤포레스트는 훈련 세트에 있는 특성의 범위 밖으로 외삽할 수 있는 능력이 없음
마지막 훈련 세트 데이터의 타깃 값을 예측으로 사용
'머신러닝' 카테고리의 다른 글
| 알고리즘 체인과 파이프라인 (0) | 2021.08.09 |
|---|---|
| 모델 평가와 성능 향상 (0) | 2021.08.05 |
| clustering (0) | 2021.07.25 |
| 차원축소, 특성 추출, 매니폴드 학습 (0) | 2021.07.22 |
| 비지도 학습(데이터 전처리와 스케일 조정) (0) | 2021.07.22 |