seaborn의 기본 데이터셋인 연비(mpg) 예측 데이터를 사용한 회귀 모델 예시입니다.
정확도를 높이는 등의 학습 기법보단 데이터 전처리 위주로 작성하였습니다.
MPG 회귀 (Regression) 예측¶
0. 필요 library 호출¶
In [1]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
In [2]:
import warnings
warnings.filterwarnings("ignore")
1. 데이터셋 호출 및 탐색¶
In [3]:
mpg_df = sns.load_dataset('mpg')
구조 파악¶
In [4]:
print(mpg_df.shape)
mpg_df.head(5)
Out[4]:
상관 계수 확인¶
In [5]:
corr = mpg_df.corr()
#mpg와 0.75 이상의 상관계수를 가진 특성들
high_corr = corr.index[abs(corr['mpg']) > 0.75]
corr['mpg'][high_corr].to_frame()
Out[5]:
In [6]:
#히트맵으로 확인
plt.figure(figsize=(7,7))
g = sns.heatmap(mpg_df[high_corr].corr(), annot=True, cmap='RdYlBu')
2. 데이터 전처리¶
- 머신러닝 학습을 하기 전에 null값을 제거, 카테고리 변수 변경, outlier 제거 등과 같은
데이터 전처리 작업이 필요합니다.
null값 확인 및 제거 or 채우기¶
In [7]:
print(mpg_df.isna().sum())
print('shape:', mpg_df.shape)
제거: horsepower가 null인 행 6개가 제거 되었습니다.¶
In [8]:
mpg_df = mpg_df.dropna()
print(mpg_df.isna().sum())
print('shape:', mpg_df.shape)
채우기¶
- float/int: 해당 특성값의 평균 (mean)으로 채워줍니다.
- object: 가장 많이 등장한 값 (mode)으로 채워줍니다.
- 해당 예제에서는 object인 특성 값이 null인 경우가 없기 때문에, 임의로
가장 첫번째 열의 origin 값을 null로 만든 후 진행을 해보겠습니다.
In [9]:
#데이터셋 다시 불러오기
mpg_df = sns.load_dataset('mpg')
In [10]:
# 임의로 string null값 생성
mpg_df['origin'][0] = np.nan
In [11]:
# null값이 있는 특성 list 생성
null_col = list(mpg_df.columns[mpg_df.isna().any()])
null_col
Out[11]:
In [12]:
mpg_df.loc[mpg_df.horsepower.isnull()]
Out[12]:
In [13]:
mpg_df.loc[mpg_df.origin.isnull()]
Out[13]:
In [14]:
# null값을 채운 이후 확인을 위한 index값 받기
horse_null_idx = list(mpg_df.loc[mpg_df.horsepower.isnull()].index)
origin_null_idx = list(mpg_df.loc[mpg_df.origin.isnull()].index)
따로 처리를 하기 위해 type별 list를 생성하고, 해당 type에 맞는 특성 이름을 담아둡니다.¶
In [15]:
float_int_null_list = []
obj_null_list = []
for col in null_col:
dtype = mpg_df[col].dtypes
if dtype == 'float64' or dtype == 'int64':
float_int_null_list.append(col)
else:
obj_null_list.append(col)
In [16]:
print(float_int_null_list)
print(obj_null_list)
In [17]:
# float, int null값 채우기
for col in float_int_null_list:
mpg_df[col] = mpg_df[col].fillna(mpg_df[col].mean())
# object null값 채우기
for col in obj_null_list:
mpg_df[col] = mpg_df[col].fillna(mpg_df[col].mode()[0])
null값이 정상적으로 채워졌습니다¶
In [18]:
mpg_df.loc[horse_null_idx]
Out[18]:
In [19]:
mpg_df.loc[origin_null_idx]
Out[19]:
In [20]:
print(mpg_df.isna().sum().max())
object 변수 확인 및 변경¶
- 기계는 기본적으로 문자를 인식하지 못하기 때문에, 문자로 된 카테고리 특성의 경우 숫자로
변경을 해줘야 합니다. 또한, 숫자로 구성된 특성이라 할지라도 카테고리 특성일 경우가 있기 때문에
사전에 확인이 필요합니다.
In [21]:
mpg_df.head()
Out[21]:
In [22]:
mpg_df.dtypes
Out[22]:
origin과 name 변수를 확인해줍니다.¶
In [23]:
mpg_df.select_dtypes(include=['object']).head()
Out[23]:
In [24]:
mpg_df['origin'].value_counts()[:10]
Out[24]:
In [25]:
mpg_df['name'].value_counts()[:10]
Out[25]:
3개의 카테고리로 구성된 origin 변수를 카테고리 타입으로 바꿔줍니다.¶
In [26]:
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
label_origin = le.fit_transform(mpg_df['origin'])
mpg_df['origin'] = label_origin
각 순서별 europe: 0, japan: 1, usa: 2 로 변경이 되었습니다.¶
In [27]:
mpg_df['origin'].value_counts()
Out[27]:
In [28]:
# inverse_transform을 통해 원래대로 되돌리는 것도 가능합니다.
# le.inverse_transform(label_origin)
name도 동일하게 변경해줍니다.¶
In [29]:
mpg_df['name'] = le.fit_transform(mpg_df['name'])
Outlier 확인 및 제거¶
In [30]:
# 특성 list 생성
mpg_df_col = list(mpg_df.columns)
# 카테고리 특성 따로 분류
mpg_df_cat = mpg_df[['mpg', 'origin', 'name']]
mpg_df.drop(columns=list(mpg_df_cat.columns),inplace=True)
# outlier 개수 확인
q1 = mpg_df.quantile(0.25)
q3 = mpg_df.quantile(0.75)
iqr = q3 - q1
((mpg_df < (q1 - 1.5*iqr)) | (mpg_df > (q3 + 1.5*iqr))).sum().to_frame(name='outliers')
Out[30]:
아래와 같이 scipy.stats의 zscore를 통해 간단히 제거 가능합니다.¶
In [31]:
from scipy import stats
mpg_df_no_outlier = mpg_df[(np.abs(stats.zscore(mpg_df))< 3).all(axis=1)]
In [32]:
print(mpg_df.shape)
print(mpg_df_no_outlier.shape)
In [33]:
#하나의 특성만으로도 제거 가능
# mpg_df_dummy[(np.abs(stats.zscore(mpg_df_dummy['horsepower'])) < 3)]
index를 기준으로 카테고리 특성과 합쳐준 후, 순서를 복원해줍니다.¶
In [34]:
mpg_df_no_outlier = pd.merge(mpg_df_no_outlier, mpg_df_cat, left_index=True, right_index=True, how='inner')
mpg_df_no_outlier = mpg_df_no_outlier[mpg_df_col]
mpg_df_no_outlier.shape
Out[34]:
In [ ]:
데이터 분리 및 표준화¶
학습할 데이터, 시험할 데이터를 기존 데이터셋에서 분리해줍니다.¶
분리¶
- 학습: 80%, 시험: 20%로 유지를 해보겠습니다.
In [35]:
from sklearn.model_selection import train_test_split
features = mpg_df_no_outlier.drop(columns=['mpg'])
target = mpg_df_no_outlier['mpg']
#순서는 중요하지 않으므로 shuffle=True로 데이터를 섞어줍니다.
x_train, x_test, y_train, y_test = train_test_split(features, target, test_size=0.2,
shuffle=True, random_state=42)
In [36]:
x_train.head()
Out[36]:
In [37]:
y_train[:5]
Out[37]:
데이터 표준화¶
- 특성들이 모두 비슷한 영향력을 가질 수 있도록 표준화를 시켜줘야 합니다.
- 평균과 표준편차를 사용한 기본 스케일러인 StandardScaler를 사용해보겠습니다.
In [38]:
#기초통계 확인
# stats = mpg_df_no_outlier.loc[:, mpg_df_no_outlier.columns != 'mpg'].describe().transpose()
stats = mpg_df_no_outlier.describe().transpose()
stats
Out[38]:
StandardScaler를 불러온 후, 표준화 진행을 해줍니다¶
In [39]:
from sklearn.preprocessing import StandardScaler
In [40]:
# 변환 확인 예시를 위한 DataFrame
sc = StandardScaler()
x_train[x_train.columns] = sc.fit_transform(x_train[x_train.columns])
x_train.head(5)
Out[40]:
In [41]:
# 변환
x_train_scaled = sc.fit_transform(x_train)
x_test_scaled = sc.fit_transform(x_test)
이제 데이터 전처리 작업이 끝났습니다.¶
3. 모델 학습 및 시험¶
간단한 Linear Regression, RandomForest, GradientBoost 3가지로 학습을 해보겠습니다.¶
In [42]:
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor
In [43]:
# LR
lr = LinearRegression()
lr.fit(x_train_scaled, y_train)
# 정확도 계산
lr_score = lr.score(x_test_scaled,y_test)
print('LinearRegression: {0:.2f}'.format(lr_score))
# RF
rf = RandomForestRegressor()
rf.fit(x_train_scaled, y_train)
# 정확도 계산
rf_score = rf.score(x_test_scaled,y_test)
print('RandomForest: {0:.2f}'.format(rf_score))
# GB
gb = GradientBoostingRegressor()
gb.fit(x_train_scaled, y_train)
# 정확도 계산
gb_score = gb.score(x_test_scaled,y_test)
print('GradientBoost: {0:.2f}'.format(gb_score))
predict를 통한 실제 예측값 확인¶
In [44]:
lr_res = lr.predict(x_test_scaled)
lr_res
Out[44]:
In [45]:
import copy
x_test_res = copy.deepcopy(x_test)
x_test_res['mpg'] = np.array(y_test)
x_test_res['mpg_pred'] =lr_res
In [46]:
x_test_res[['mpg','mpg_pred']].head()
Out[46]:
정리¶
- 본 예습에서는 학습 과정에 중점을 두기 보단, 데이터 전처리 기법에 좀 더 초점을 맞춰 진행을 하였습니다.
- 추후에는 GridSearch, Stacking 및 딥러닝 등의 고도화 된 학습 방법으로 예시를 진행해보겠습니다.
'ML&DL' 카테고리의 다른 글
앙상블 학습 (Ensemble Learning) 1 - 배깅 (Bagging) (0) | 2024.08.09 |
---|---|
머신러닝 회귀 모델 (Regression Model) 평가 지표 (0) | 2021.07.17 |
[머신러닝] K-NN (K-Nearest Neighbors) (0) | 2021.07.03 |
[머신러닝] Bias vs. Variance (Overfitting vs. Underfitting) (0) | 2021.07.01 |
머신러닝 용어집 - A (0) | 2021.06.30 |