!다중공선성을 제거 한다
#▶ 다중공선성 제거, 누구에 의해서 결과가 나왔는지 해석하기 어려움
#▶ 분석 결과인 회귀 계수가 불안정, 회귀계수가 해당 변수의 종속변수에 미치는 영향력을 올바로 설명하지 못함
df_corr = df.corr()
df_corr = df_corr[(abs(df_corr) > 0.5) & (df_corr != 1)]
df_corr
!스케일링
:특성들의 평균을 0, 분산을 1 로 스케일링하는 것입니다.
즉, 특성들을 정규분포로 만드는 것입니다.
#▶ Scaling을 통해 해석하기 쉬워짐
dfcoef_3 = pd.DataFrame({'col':X.columns, 'coef':mlr.coef}).reset_index(drop=True)
df_coef_3
!하이퍼 파라미터
:모델에 대한 상세한 세부 조정
#▶ setting the parameters
params = {}
params [ 'learning_rate'] = 0.02
params [ 'boosting_type'] = 'gbdt' # GradientBoostingDecisionTree
params ['objective'] = 'binary'
params [ 'metric' ] = 'binary_logloss' # metric for binary-class
params [ 'max_depth'] = 3
params [ 'num_leaves' ] = 6
params ['seed'] = 23456
#▶ 모델 학습
clf = lgb.train (params, d_train, 1000) # epocs에서 모델 훈련
!컨퓨전 메트릭스
:예측이 얼마나 맞았는지 체크
from sklearn.metrics import classification_report
y_pred_train = clf.predict(x_train)
for i in range(0,len(y_pred_train)):
if y_pred_train[i]>=.5: # setting threshold to .5
y_pred_train[i]=1
else:
y_pred_train[i]=0
y_pred_test = clf.predict(x_test)
for i in range(0,len(y_pred_test)):
if y_pred_test[i]>=.5: # setting threshold to .5
y_pred_test[i]=1
else:
y_pred_test[i]=0
print(classification_report(y_train, y_pred_train))
print(classification_report(y_test, y_pred_test))
-샘플 프로젝트3 (상품가입고객 예측 및 타켓 마케팅) -> 데이터 EDA 및 Classification(분류) 예측
최근 주식, 코인 투자가 열풍이 불면서 A은행의 정기예금 가입자가 감소하고 있다. 정기예금 가입률이 높았을 때는 Mass 마케팅 형식으로 홍보를 해도 투자 대비 효율이 좋았지만 현재는 가입률이 떨어지고 있기 때문에 마케팅 비용 투자 대비 효율이 감소하고 있는 상황이다. 마케팅 비용을 줄이기 위해 정기예금 가입 가능성이 높은 고객군을 추출하고 타겟 마케팅을 수행하고자 한다.
문제정의
:정기예금 가입자 감소, 마케팅 비용 투자 대비 효율 저조
기대효과
:정기예금 가입률 증가, 마케팅 비용 투자 대비 효율 증대
해결방안
:정기예금 가입 가능성이 높은 타겟 고객군 추출 및 대상 마케팅
성과측정
:대조군 대비 타겟 고객군 정기예금 가입률
운영
:매 월 Data mart 생성 후 Model을 활용하여 타겟 고객군 추출
:마케팅 후 대조군과 비교를 통해 마케팅 효과 모니터링
#feature 데이터가 모이면 Data mart가 된다.
!Data mart
데이터 살펴보기
:고객마다 과거 진행한 캠페인(마케팅)에 대한 이력과, 현재 캠페인에서 수행된 데이터가 존재
duration은 예측시 제외 (※ 통화 시간에 따라 Y(가입여부) 결정되므로 제외)
df = pd.read_csv('S_PJT03_DATA.csv', sep=';')
#이때 sep =' ; '는 보통 csv파일은 ;로 구분되는 파일인데 가끔 다른 separate 분자로 구성되있을 때도 있어서 확인해봐야한다.
-데이터 전처리
df.shape , df.info() , df.isnull().sum() , pd.DataFrame(df.describe()) -> 제일 기본적인 것들
df['y'].value_counts()
:정기 가입여부를 체크해야 하기 때문에 y의 수를 확인한다.
-범주형 변수 파악
df.columns , df['age'].dtype , df['job'].dtype
#dtype('0')라고 결과가 나온건 Object의 약자이다.
#▶ numerical, categorical data 나누기
numerical_list=[]
categorical_list=[]
for i in df.columns :
if df[i].dtype == 'O' :
categorical_list.append(i)
else :
numerical_list.append(i)
print("numerical_list :", numerical_list)
print("categorical_list :", categorical_list)
#범주형이랑 숫자형 범주랑 나눈다.
-Rule base 기반 상품 가입 예측
:머신러닝 같은 것을 사용하지 않고 규칙,로직을 가지고 가설을 수립하는 것
import numpy as np
df['y'] = np.where(df['y']=='yes', 1, 0)
df_job = df.groupby('job')['y'].agg(['count', 'sum'])
df_job['ratio'] = round((df_job['sum'] / df_job['count'])*100, 2)
df_job.sort_values(by=['ratio'], ascending = False)
#가입한 사람이 1 , 아닌 사람은 0으로 바꾼다. 원래는 Y N였다.
-모델링
#▶ Train/Test data에는 문자(str)형태로 이루어진 데이터를 Input 할 수 없음
#▶ Model에서 이해할 수 있는 1, 0으로 Target Data를 변경
import numpy as np
df['y']=np.where(df['y']=='yes', 1, 0)
df.head(10)
#문자열이 들어간 데이터를 건드리는 것은 좋지않음그래서 yes or no를 1or0으로 표기
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn import metrics
-엔코딩
from sklearn.preprocessing import LabelEncoder
categorical_list.remove('y')
for col in categorical_list:
le = LabelEncoder()
x_train[col] = le.fit_transform(x_train[col])
x_test[col] = le.transform(x_test[col])
x_train[categorical_list].head()
#엔코딩은 범주형 변수를 숫자형 변수로 바꿔준다.