일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 2023
- back propagation
- NEXT
- 플로이드 와샬
- 회고록
- BFS
- pytorch
- 자바스크립트
- 다익스트라
- 가끔은_말로
- 이분 탐색
- 조합론
- 미래는_현재와_과거로
- dfs
- object detection
- Overfitting
- 백트래킹
- 세그먼트 트리
- 분할 정복
- tensorflow
- lazy propagation
- 문자열
- 가끔은 말로
- 알고리즘
- DP
- 너비 우선 탐색
- 크루스칼
- 우선 순위 큐
- c++
- dropout
- Today
- Total
Doby's Lab
Kaggle - Learn Feature Engineering : Creating Features 본문
Kaggle - Learn Feature Engineering : Creating Features
도비(Doby) 2022. 10. 13. 23:34[이 글은 Kaggle의 Learn을 토대로 작성되었습니다. 문제가 될 시 삭제 조치하겠습니다.]
(오역되어 잘못 설명된 부분이 있을 수 있습니다.)
https://www.kaggle.com/code/ryanholbrook/creating-features
Creating Features
Explore and run machine learning code with Kaggle Notebooks | Using data from FE Course Data
www.kaggle.com
Category
- Mathematical Transform
- Count
- Building-Up and Breaking-Down Features
- Group Transforms
- Tips on Creating Features
Mathematical Transform
수치형 Feature들의 사이의 관계는 종종 수학적인 공식을 통해 나타나는 경우가 많습니다. 이런 경우와 공식은 대부분 Domain Research를 통해 알 수 있습니다. 특히 이런 연산 함수나 메서드는 Pandas를 통해 제공되고 있습니다. 이러한 관계를 파악하는 데에 있어 도메인 지식의 중요성을 강조합니다.
예를 들어, 차의 엔진에 관한 Automobile dataset에서는 엔진이 성능에 반해 얼마나 효율적인지에 대해 'stroke ratio'라는 새로운 feature를 만들어낼 수 있습니다. 'stroke ratio'라는 feature는 Domain Research를 통해 나온 결과입니다. 코드로 표현하면 아래와 같습니다.
autos["stroke_ratio"] = autos.stroke / autos.bore
autos[["stroke", "bore", "stroke_ratio"]].head()
하지만, Domain Research로부터 나온 공식이 너무 복잡한 경우 모델이 학습하기에 어려울 수 있습니다. 다음과 같은 예시를 사례로 들 수 있습니다.
autos["displacement"] = (
np.pi * ((0.5 * autos.bore) ** 2) * autos.stroke * autos.num_of_cylinders
)
Data Visualization을 통해서 Skew(비대칭) 되어있는 데이터를 확인하고, Log나 Power를 통해 분포를 고르게 할 수 있습니다. US Accidents Dataset에 WindSpeed가 그런 현상을 보이며 Log를 취하여 Skew를 없애보겠습니다.
# If the feature has 0.0 values, use np.log1p (log(1+x)) instead of np.log
accidents["LogWindSpeed"] = accidents.WindSpeed.apply(np.log1p)
# Plot a comparison
fig, axs = plt.subplots(1, 2, figsize=(8, 4))
sns.kdeplot(accidents.WindSpeed, shade=True, ax=axs[0])
sns.kdeplot(accidents.LogWindSpeed, shade=True, ax=axs[1]);
Counts
Presence or Absence(존재의 여부)에 대해 나타내고 있는 Feature는 되려 Dataset에서 리스크를 가져올 수 있습니다. 이러한 Feature들을 집계하여 Count라는 Feature를 만들 수 있습니다.
존재의 여부를 나타내는 Feature는 Binary(1 or 0, True or False)로 나타납니다. 파이썬은 1이나 True 같은 값들을 정수처럼 더할 수 있는 함수가 있으며 이를 활용합니다. 아래 예시를 통해 다루어봅시다.
'Traffic Accidents' Dataset의 몇몇 Feature는 Accident와 연관된 도로의 물체(Roadway Object)에 관한 Feature가 있습니다. 이러한 Feature들을 집계하여 Count라는 Feature를 만들어봅시다.
roadway_features = ["Amenity", "Bump", "Crossing", "GiveWay",
"Junction", "NoExit", "Railway", "Roundabout", "Station", "Stop",
"TrafficCalming", "TrafficSignal"]
accidents["RoadwayFeatures"] = accidents[roadway_features].sum(axis=1)
accidents[roadway_features + ["RoadwayFeatures"]].head(10)
다음과 같이 True인 값들을 모두 더하여 'RoadwayFeatures'라는 Feature를 만들어냈습니다.
다음과 같은 상황은 어떨까요? 목적과 관련된 Feature가 꼭 Binary값으로 나타나서 존재의 여부를 묻는 것이 아니라 Interger값으로 나타나서 각 Feature마다 여러 수치를 나타내지만 0으로써 존재의 Absence를 나타낸다면 count를 할 수 있을까요? gt 메서드를 활용하여 아래 코드와 같이 해결할 수 있습니다.
components = [ "Cement", "BlastFurnaceSlag", "FlyAsh", "Water",
"Superplasticizer", "CoarseAggregate", "FineAggregate"]
concrete["Components"] = concrete[components].gt(0).sum(axis=1)
concrete[components + ["Components"]].head(10)
Building-Up and Breaking-Down Features
위 2가지는 Numerical Feature만 다루었지만 꼭 Numerical Feature만 존재하는 것은 아닙니다. Categorical Feature처럼 string 형태의 Data만 존재할 수도 있습니다. factorize를 통해 Label Encoding을 하여 모델 훈련에 적합하게 처리할 수 있겠지만 그전에 생각해보아야 할 것이 있습니다.
string data에서 분리시켜 얻을 수 있는 중요한 정보나 반대로 합쳐서 중요한 정보를 얻을 수 있다는 것을 생각해보아야 합니다. 이런 생각 자체도 Domain Research를 통해 떠올릴 수 있습니다.
[Breaking Down]
이런 예시를 들 수 있습니다. 사람들마다 보험의 타입과 레벨이 string으로 표현된 데이터가 있습니다. 보험에 대해 도메인 지식이 있다거나 구분해두는 게 좋다고 떠올릴 수 있는 사람은 아래와 같이 split 할 것입니다.
customer[["Type", "Level"]] = ( # Create two new features
customer["Policy"] # from the Policy feature
.str # through the string accessor
.split(" ", expand=True) # by splitting on " "
# and expanding the result into separate columns
)
customer[["Policy", "Type", "Level"]].head(10)
[Building-Up]
반대로 각 Feature 간의 interaction이 있다는 것에 Domain Research에 기반에 두고 확신이 있다면 합치는 경우도 있습니다. (주관적인 생각, Categorical Feature일 경우 Building-Up을 하고, Numerical Feature일 경우 관계를 나타내는 공식을 찾아 Mathematical Tranformation을 해보는 경향이 있는 거 같습니다.)
autos["make_and_style"] = autos["make"] + "_" + autos["body_style"]
autos[["make", "body_style", "make_and_style"]].head()
Group Transforms
Dataset을 보다 보면 Feature가 겹치는 경우가 많고, 이에 따라 다른 Feature들이 있는 경우가 있습니다. 전자를 1번, 후자를 2번 Feature라 해보겠습니다. 1번 Feature에 따라 Sample을 Grouping 시킬 수 있습니다. Grouping 된 sample에서 2번 Feature에 대해 통계적인 연산(평균, 최대, 최소, 최빈)을 하여 각 Group을 대표하는 2번 Feature가 생성될 수 있습니다.
즉, Dataset을 특정 Feature 기준으로 그룹화시켜 그룹에 따른 다른 Feature에 통계적 연산을 통해 새로운 Feature를 만들 수 있습니다. 아래 예시를 보겠습니다.
각 State로 그룹화시켜 각 그룹에 대한 Income의 평균값을 구하여 AverageIncome이라는 Feature를 만들어주었습니다.
customer["AverageIncome"] = (
customer.groupby("State") # for each state
["Income"] # select the income
.transform("mean") # and compute its mean
)
customer[["State", "Income", "AverageIncome"]].head(10)
평균값뿐만 아니라 전체적인 데이터에 대해 특정 그룹에 대한 빈도 값 또한 새로운 Feature로 쓸 수 있습니다.
customer["StateFreq"] = (
customer.groupby("State")
["State"]
.transform("count")
/ customer.State.count()
)
customer[["State", "StateFreq"]].head(10)
추가적으로 Kaggle을 함에 있어서 test set에 overfitting이 되지 않도록 validation set을 쓰는데 test set에 변동사항이 있으면 validation set에도 똑같이 적용을 시켜주어야 합니다. 이러한 작업을 Pandas의 merge를 통해 할 수 있습니다.
# Create splits
df_train = customer.sample(frac=0.5)
df_valid = customer.drop(df_train.index)
# Create the average claim amount by coverage type, on the training set
df_train["AverageClaim"] = df_train.groupby("Coverage")["ClaimAmount"].transform("mean")
# Merge the values into the validation set
df_valid = df_valid.merge(
df_train[["Coverage", "AverageClaim"]].drop_duplicates(), # 중복 행 제거
on="Coverage", # Coverage에 맞추어
how="left", # A와 B라는 집합이 있을 때, A에 대하여
)
df_valid[["Coverage", "AverageClaim"]].head(10)
Tips on Creating Features
- Linear Model은 합과 차이에 대해서는 잘 학습하지만, 이보다 복잡한 것에 대해서는 배우기 어렵습니다.
- Combine으로부터 나온 Ratio는 대부분의 모델이 학습하기 어려워 보이지만 보통 좋은 퍼포먼스를 내는 것으로 이끌어줍니다.
- Linear Model이나 신경망 모델은 대부분 Normalized 된 Data에서 좋은 퍼포먼스를 보입니다. 특히, 신경망 모델은 0으로부터 그리 멀지 않은 값을 가지는 Scaling 된 Data가 적합합니다. 트리에 기반을 둔 모델은 가끔 Normalized 된 Data에서 가끔 이점을 가질 수는 있지만 보통 그렇지는 않습니다.
- Tree Model에서 Combination은 모델에 이점을 가져다 줄 정도로 중요하거나 데이터가 제한적일 때, 사용하는 것이 좋습니다.
- Count 기법은 Tree Model에 많은 도움이 됩니다. 왜냐하면 이러한 모델들은 많은 Feature를 한 번에 집계해놓은 정보를 알 수 있는 방법이 없기 때문입니다.
'Data Science > Feature Engineering' 카테고리의 다른 글
Kaggle - Learn Feature Engineering : Target Encoding (0) | 2022.10.22 |
---|---|
Kaggle - Learn Feature Engineering : Principal Component Analysis (0) | 2022.10.22 |
Kaggle - Learn Feature Engineering : Clustering With K-Means (0) | 2022.10.17 |
Kaggle - Learn Feature Engineering : Mutual Information (0) | 2022.10.10 |