1. 데이터 불러오기
bicycle = pd.read_csv('train.csv')
display(bicycle.head())
display(bicycle.info())
display(f"{bicycle['date_time'].iloc[0]} ~ {bicycle['date_time'].iloc[-1]}")
2. 날짜 관련 피처 생성하기
bicycle.info() 정보를 보면 'date_time' 컬럼이 'object'형으로 문자열(string) 타입임을 알 수 있습니다.
모델에 수치형 변수를 넣고 학습시키기 위해선 문자열 타입을 숫자로 바꿔주는 작업이 필요합니다.
def seperate_datetime(dataframe):
year = []
month = []
day = []
for date in dataframe.date_time:
year_point, month_point, day_point = date.split('-') # - 기준으로 string을 나누고 list로 만듦 ex) '2016-04-01' -> ['2016', '04', '01']
year.append(int(year_point)-2017)
month.append(int(month_point)-3)
day.append(int(day_point))
return year, month, day
year, month, day = seperate_datetime(bicycle)
bicycle['year'] = year
bicycle['month'] = month
bicycle['day'] = day
bicycle.head()
3. 피처 데이터와 정답 데이터로 나누기
X = bicycle.drop(['date_time', 'number_of_rentals'], axis=1)
y = bicycle.number_of_rentals
4. 평가 산식과 기본 모델 fitting 성능 확인
NAME 함수 : 실제값과 예측값 사이의 차이를 절대값으로 취한 후 실제 값으로 나누어 평균을 내는 함수 입니다.
이는 오차의 크기가 원래 값에 대해 상대적으로 얼마나 큰지를 나타내는 정규화된 지표입니다.
낮은 NMAE 값은 모델의 예측이 실제 값에 가깝다는 것을 의미합니다.
from sklearn.linear_model import LinearRegression
# metric 정의
import numpy as np
def NMAE(true, pred):
score = np.mean(np.abs(true-pred) / true)
return score
model = LinearRegression() # 모델 정의
model.fit(X, y) # 학습
y_hat = model.predict(X) # y 예측
score = NMAE(y, y_hat)
print(f'모델 NMAE: {score}')
모델 NMAE: 0.3234797521201454
5. Feature Engineering by Human
5.1 Feature Engineering 1 by Human : 요일 정보 추가
from sklearn.preprocessing import LabelEncoder
# 1번은 사람 손으로 만든 feature들을 사용합니다.
X_human = X.copy()
# 요일 정보 추가
week_day = pd.to_datetime(bicycle['date_time']).dt.day_name()
le = LabelEncoder()
le.fit(week_day)
X_human['week_day'] = le.transform(week_day)
X_human.head()
5.2 Feature Engineering 1 by Human : 온도 정보 추가
# 1. "일교차가 너무 큰 날씨"를 알기 위한 정보
X_human['temp_diff_info'] = X_human['high_temp'] - X_human['low_temp']
# 2. "덥고 습한 날씨"를 알기 위한 정보
X_human['sweat_info'] = X_human['high_temp'] * X_human['humidity']
# 3. "춥고 바람부는 날씨"를 알기 위한 정보
X_human['cold_info'] = X_human['low_temp'] * X_human['wind_speed']
X_human.head()
5.3 새로운 feature추가에 따른 성능 변화 확인
model = LinearRegression() # 모델 정의
model.fit(X_human, y) # 학습
y_hat = model.predict(X_human) # y 예측
score = NMAE(y, y_hat)
print(f'모델 NMAE: {score}')
모델 NMAE: 0.28426261278332077
6. Feature Engineering by Computer
6.1 Feature Engineering 2 by Computer : 자동 피처 엔지니어링
# 2번은 컴퓨터로 만든 feature들을 사용합니다.
X_computer = X.copy()
col_list = X_computer.columns
# 이중 for문을 사용하여 feature 자기 자신의 제곱과 두 feature간의 곱이라는 새로운 feature를 추가합니다.
for i in range(len(col_list)):
for j in range(i, len(col_list)):
X_computer[f'{col_list[i]}*{col_list[j]}'] = X_computer[col_list[i]] * X_computer[col_list[j]]
X_computer.head()
5 rows × 77 columns
6.2 자동 연산 통해 생성된 feature의 성능 확인
model = LinearRegression() # 모델 정의
model.fit(X_computer, y) # 학습
y_hat = model.predict(X_computer) # y 예측
score = NMAE(y, y_hat)
print(f'모델 NMAE: {score}')
모델 NMAE: 0.1401335572950723
7. Feature Engineering by Human & Computer
7.1 Feature Engineering 3 by Human & Computer
from sklearn.preprocessing import LabelEncoder
# 3번은 2번에 사람의 도메인 지식을 추가한 형태입니다.
X_combination = X.copy()
# 요일 정보 추가
week_day = pd.to_datetime(bicycle['date_time']).dt.day_name()
le = LabelEncoder()
le.fit(week_day)
X_combination['week_day'] = le.transform(week_day)
# 1. "일교차가 너무 큰 날씨"를 알기 위한 정보
X_combination['temp_diff_info'] = X_combination['high_temp'] - X_combination['low_temp']
# 2. "덥고 습한 날씨"를 알기 위한 정보
X_combination['sweat_info'] = X_combination['high_temp'] * X_combination['humidity']
# 3. "춥고 바람부는 날씨"를 알기 위한 정보
X_combination['cold_info'] = X_combination['low_temp'] * X_combination['wind_speed']
7.2 자동 연산 통한 피처 생성
col_list = X_combination.columns
# 이중 for문을 사용하여 변수 자기 자신의 제곱과 두 변수간의 곱이라는 새로운 변수를 추가합니다.
for i in range(len(col_list)):
for j in range(i, len(col_list)):
X_combination[f'{col_list[i]}*{col_list[j]}'] = X_combination[col_list[i]] * X_combination[col_list[j]]
7.3 성능 확인
model = LinearRegression() # 모델 정의
model.fit(X_combination, y) # 학습
y_hat = model.predict(X_combination) # y 예측
score = NMAE(y, y_hat)
print(f'모델 NMAE: {score}')
모델 NMAE: 0.10278949664866364
8. 피처를 생성하는 의미
자동 연산에 의한 피처 생성이라는 개념은 본질적으로 기계 학습 모델이 데이터의 비선형 관계를 더 잘 이해할 수 있도록 돕는 방법 중 하나입니다.
사이킷런의 PolynomialFeatures 같은 도구를 사용하여 새로운 피처를 생성하는 것은 데이터 내 숨겨진 패턴이나 관계를 모델이 더 잘 포착하게 하려는 시도입니다.
여기에는 몇 가지 수학적 연산이 포함되며, 각각은 데이터를 다른 방식으로 변형하여 모델에 추가적인 정보를 제공합니다.
더하기 (Addition)
두 피처를 더하는 것은 피처 간의 선형 조합을 생성합니다.
예를 들어, "저축 계좌 잔액"과 "체크 계좌 잔액"을 더해 "총 계좌 잔액"이라는 새로운 피처를 만들 수 있습니다. 이는 모델이 전체 자산 규모를 더 잘 이해하는 데 도움이 됩니다.
빼기 (Subtraction)
한 피처에서 다른 피처를 빼는 것은 피처 간의 차이를 강조합니다.
예를 들어, "판매 가격"과 "제조 비용"을 빼 "순이익"을 계산할 수 있으며, 이는 이윤이 얼마나 발생하는지를 모델에게 알려줍니다.
곱하기 (Multiplication)
두 피처의 곱은 종종 피처 간의 상호작용을 나타냅니다.
예를 들어, "시간당 광고 노출 수"와 "클릭률"을 곱하여 "총 클릭 수"를 얻을 수 있습니다. 이는 광고의 효과를 평가할 때 유용합니다.
제곱 (Squaring)
피처의 제곱은 해당 피처의 중요도를 증가시킬 수 있습니다.
예를 들어, "거리"를 제곱하여 "거리의 제곱"을 만들면, 단순한 거리보다 멀리 있는 지점의 중요도를 더 크게 만들어줍니다. 이는 거리에 따른 효과가 비선형적일 때 유용합니다.
나누기 (Division)
한 피처를 다른 피처로 나누는 것은 비율을 생성합니다.
예를 들어, "총 판매 수익"을 "방문자 수"로 나누어 "방문자 당 평균 수익"을 계산할 수 있습니다. 이는 방문자의 품질이나 가치를 평가하는 데 중요할 수 있습니다.
자동 연산에 의한 피처 생성은 데이터의 원본 구조를 확장하고, 모델이 선형 관계와 비선형 관계를 모두 이해할 수 있게 해주지만, 항상 주의 깊게 적용해야 합니다. 각각의 연산이 실제로 데이터에 어떤 의미를 가지는지, 그리고 생성된 피처가 모델에 어떤 영향을 미칠지를 평가하는 것이 중요합니다. 또한, 무작위로 피처를 생성하고 이를 모델에 적용하기 보다는 피처가 가지는 의미와 모델의 목적을 이해하고, 이에 기반하여 피처를 선택하는 것이 효과적입니다.
'머신러닝 > 머신러닝: 기초 내용' 카테고리의 다른 글
데이터 불균형 극복방법 1 : 오버샘플링 (0) | 2024.12.15 |
---|---|
데이터 불균형 (0) | 2024.12.15 |
다변량 이상치 (0) | 2024.12.13 |
단변량 이상치 (0) | 2024.12.12 |
데이터 전처리 입문 (0) | 2024.12.11 |