1. What is Feature Engineering
- Improve a model's predictive performance
- Reduce computational or data needs
- Improve interpetability of the results
Feature Engineering은 머신러닝 알고리즘을 작동하기 위해 데이터에 대한 도메인 지식을 활용하여 특징을 만들어내는 과정이다. 즉, 머신러닝 모델을 위한 데이터 테이블의 컬럼을 생성하거나 선택하는 작업이다.
머신러닝은 입력 데이터의 함수이며 선형 또는 비선형의 형태를 가질 수 있는데, 우리는 훈련 데이터를 사용해서 이 함수를 학습하지만, 매번 학습이 잘 되어 결과가 나타나지 않는다. 내가 가지고 있는 데이터가 방대하다해도 그 데이터를 모두 결과를 도출하는데 쓰면 정확히 나타날 듯 하지만 오히려 결과를 잘못되게 도출하는 경우도 많다. 이는 통계분석에서 선형 함수의 독립변수가 많다고 해서 종속변수의 기대값이 정확도가 무조건 올라가지 않는 이유와 동일하다.
즉, 머신러닝의 성능은 어떤 데이터를 입력하는지가 굉장이 의존적이며 부족하지도 과하지도 않은 입력데이터가 필요하다. 그리하여 충분한 데이터를 먼저 모으고 어떤 Feature가 유용한지 아닌지를 확인하는 과정을 거친다.
2. Mutual Information
feature 활용 측정 순위를 구축하는 방법은 feature와 target간 상호작용을 측정하는 함수를 만드는 것이다. 이 측정 값을 우리는 "mutual Information"이라고 한다. Mutual Information은 Correlation과 같이 두 양 사이의 관게를 측정한다. Mutual Information을 사용하는 이점은 어떤 관계에 대해서도 측정을 할 수 있다는 것이다.
Mutual Information은 우리가 아직 어떤 모델을 사용할지 결정이 되지 않는 상태에서 모델 발견을 하는데 사용되는 가장 일반적인 측정 척도이다.
- Easy to use and interpret
- Computationally efficent
- Theoretically well-founded
- Resistant to overfitting
- Able to detect any kind of relationship
2.1 Mutual information and what it meausures
상호의존정보(Mutual Information)은 확률 이론과 정보 이론에서 두 개의 무작위 변수의 상호 의존성을 측정한 것이다. 다른 무작위 변수를 통해 하나의 무작위 변수에 대해 얻어진 "정보량"을 정량화 하는 값이다.
2.2 Interpreting Mutual information scores
상호의존정보의 가장 최솟값은 0.0으로 두 변수가 서로 독립임을 의미한다.
- 상호의존정보는 feature와 target간에 잠재적인 관계를 이해하는데 도움을 준다
- 단독으로는 힘을 얻지 못하지만 다른 변수와 상호작용한다면 정보력을 가지게 된다
2.3 What need to focus
- scikit-learn 라이브러리는 연속형 변수와 이산형 변수를 다르게 처리한다. 그리하여 mutual_info_regression() 함수 내부의 parameter discrete_features에 discrete 변수를 지정해주어야 한다. 또한 함수 내부에 input되는 값은 float type값을 가지고 있어야 해서 Categorcal varaible를 적용하고 싶다면 label encoding 처리를 한 후 입력해야한다.
- scikit-learn은 target 변수가 연속형이냐 범주형이냐에 따라 mutual_info_regression, mutual_info_classif 함수를 나누어 적용한다.
from sklearn.feature_selection import mutual_info_regression
def make_mi_scores(X, y, discrete_features):
mi_scores = mutual_info_regression(X, y, discrete_features=discrete_features)
mi_scores = pd.Series(mi_scores, name="MI Scores", index=X.columns)
mi_scores = mi_scores.sort_values(ascending=False)
return mi_scores
def plot_mi_scores(scores):
scores = scores.sort_values(ascending=True)
width = np.arange(len(scores))
ticks = list(scores.index)
plt.barh(width, scores)
plt.yticks(width, ticks)
plt.title("Mutual Information Scores")
상호 의존정보(Mutual Information)
확률이론과 정보이론에서 두 개의 무작위 변수의 상호의전정보는 두 변수 사이의 상호 의존성을 측정한 것이다. 다른 무작위 변수를 통해 하나의 무작위 변수에 대해 얻어진 "정보량"을 정량화 한다.
Mutual Information Classification
- sklearn.feature_selection.mutual_info_classif(X, y, discrete_features = 'auto', n_neighbors = 3, copy = True, random_state = None)
from sklearn.feature_selection import mutual_info_classif
# Set Month, Day, Week as category dtype
mutual_data = flight_train.copy()
y = mutual_data.pop('Delay_15min')
#mutual_data[['Month', 'Day', 'Week']] = mutual_data[['Month', 'Day', 'Week']].astype('category')
# Select discrete features
discrete_features = ['UniqueCarrier', 'Origin', 'Dest', 'Dephour']
for col in discrete_features :
mutual_data[col], _ = mutual_data[col].factorize()
discrete_features = [pd.api.types.is_integer_dtype(t) for t in mutual_data.dtypes]
# Calculate mutual information
mi_scores = mutual_info_classif(mutual_data, y, discrete_features = discrete_features, random_state = 0)
mi_scores = pd.Series(mi_scores, name = "MI Scores", index = mutual_data.columns)
mi_scores = mi_scores.sort_values(ascending = False)
mi_scores
Source of the course : Kaggle Course _ Mutual Information
Mutual Information
Explore and run machine learning code with Kaggle Notebooks | Using data from FE Course Data
www.kaggle.com
'Course > [Kaggle] Data Science' 카테고리의 다른 글
[FE] Clustering with K-means (0) | 2022.02.21 |
---|---|
[FE] Creating Features (0) | 2022.02.21 |
[ML] GridSearchCV (0) | 2022.02.19 |
[ML] Data Leakage (0) | 2022.02.19 |
[ML] XGBoost (0) | 2022.02.19 |