스터디 포스트 >  실전문제로 배우는 머신러닝

행동 분석으로 고객 유도하기

오혜수 멘토
안녕하세요! 저는 머신러닝에 관심 있는 취준생입니다!

실전문제로 배우는 머신러닝 - 3주차

 
💡
앱 행동 분석을 통해 고객의 구독 유도하기
 
안녕하세요 😃
이번에는 앱 행동 분석을 통해 고객을 구독 제품으로 안내하는 프로젝트를 진행할 것입니다!
 
프로젝트의 목표
  • 무료 유저를 유료 멤버로 전환
 
적용할 수 있는 점
  • 유료 버전의 앱을 등록할 가능성이 없는 유저를 식별하고, 이러한 사용자를 대상으로 마케팅
 
데이터
  • 앱을 처음 연 후 처음 24시간 동안의 데이터
 
이제 시작해봅시다!

1. 라이브러리 호출


import pandas as pd
import numpy as np
import seaborn as sn
import matplotlib.pyplot as plt
import time
 

2. Data 불러오기


dataset = pd.read_csv('./new_appdata10.csv')
 

3. Data Pre-Processing


 
splitting independent and response variables
response = dataset["enrolled"]
dataset = dataset.drop(columns="enrolled")
 
Splitting the dataset into the Training set and Test set
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(dataset, response,
                                                    test_size = 0.2,
                                                    random_state = 0)
 
Balancing the Training Set
import random
 y_train.value_counts()

 pos_index = y_train[y_train.values == 1].index
 neg_index = y_train[y_train.values == 0].index

 if len(pos_index) > len(neg_index):
     higher = pos_index
     lower = neg_index
 else:
     higher = neg_index
     lower = pos_index

 random.seed(0)
 higher = np.random.choice(higher, size=len(lower))
 lower = np.asarray(lower)
 new_indexes = np.concatenate((lower, higher))

 X_train = X_train.loc[new_indexes,]
 y_train = y_train[new_indexes]
 
Removing Identifiers
train_identity = X_train['user']
X_train = X_train.drop(columns = ['user'])
test_identity = X_test['user']
X_test = X_test.drop(columns = ['user'])
 
Feature Scaling
from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
X_train2 = pd.DataFrame(sc_X.fit_transform(X_train))
X_test2 = pd.DataFrame(sc_X.transform(X_test))
X_train2.columns = X_train.columns.values
X_test2.columns = X_test.columns.values
X_train2.index = X_train.index.values
X_test2.index = X_test.index.values
X_train = X_train2
X_test = X_test2
 

4. Model Building


 
Fitting Model to the Training Set
from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression(random_state = 0, penalty = 'l1')
classifier.fit(X_train, y_train)
 
Predicting Test Set
y_pred = classifier.predict(X_test)
 

5. Evaluating Results


 
from sklearn.metrics import confusion_matrix, accuracy_score, f1_score, precision_score, recall_score
cm = confusion_matrix(y_test, y_pred)
accuracy_score(y_test, y_pred)
precision_score(y_test, y_pred) # tp / (tp + fp)
recall_score(y_test, y_pred) # tp / (tp + fn)
f1_score(y_test, y_pred)

df_cm = pd.DataFrame(cm, index = (0, 1), columns = (0, 1))
plt.figure(figsize = (10,7))
sn.set(font_scale=1.4)
sn.heatmap(df_cm, annot=True, fmt='g')
print("Test Data Accuracy: %0.4f" % accuracy_score(y_test, y_pred))
 
Applying k-Fold Cross Validation
from sklearn.model_selection import cross_val_score
accuracies = cross_val_score(estimator = classifier, X = X_train, y = y_train, cv = 10)
print("SVM Accuracy: %0.3f (+/- %0.3f)" % (accuracies.mean(), accuracies.std() * 2))

# Analyzing Coefficients
pd.concat([pd.DataFrame(dataset.drop(columns = 'user').columns, columns = ["features"]),
           pd.DataFrame(np.transpose(classifier.coef_), columns = ["coef"])
           ],axis = 1)
 

6. Model Tuning


 
Grid Search
from sklearn.model_selection import GridSearchCV
 
Select Regularization Method
penalty = ['l1', 'l2']
 
Create regularization hyperparameter space
C = [0.001, 0.01, 0.1, 1, 10, 100, 1000]
 
Combine Parameters
parameters = dict(C=C, penalty=penalty)

grid_search = GridSearchCV(estimator = classifier,
                           param_grid = parameters,
                           scoring = "accuracy",
                           cv = 10,
                           n_jobs = -1)
t0 = time.time()
grid_search = grid_search.fit(X_train, y_train)
t1 = time.time()
print("Took %0.2f seconds" % (t1 - t0))

rf_best_accuracy = grid_search.best_score_
rf_best_parameters = grid_search.best_params_
rf_best_accuracy, rf_best_parameters
 

7. Grid Search


 
Select Regularization Method
penalty = ['l1', 'l2']
 
Create regularization hyperparameter space
C = [0.1, 0.5, 0.9, 1, 2, 5]
 
Combine Parameters
parameters = dict(C=C, penalty=penalty)

grid_search = GridSearchCV(estimator = classifier,
                           param_grid = parameters,
                           scoring = "accuracy",
                           cv = 10,
                           n_jobs = -1)
t0 = time.time()
grid_search = grid_search.fit(X_train, y_train)
t1 = time.time()
print("Took %0.2f seconds" % (t1 - t0))

rf_best_accuracy = grid_search.best_score_
rf_best_parameters = grid_search.best_params_
rf_best_accuracy, rf_best_parameters
grid_search.best_score_
 

8. End of Model


 
Formatting Final Results
final_results = pd.concat([y_test, test_identity], axis = 1).dropna()
final_results['predicted_reach'] = y_pred
final_results = final_results[['user', 'enrolled', 'predicted_reach']].reset_index(drop=True)
 
 
 
 

 
 
본 스터디는 Udemy의 <【한글자막】 Machine Learning 완벽 실습 : 6가지 실제 사례 직접 해결하기> 강의를 활용해 진행됐습니다. 강의에 대한 자세한 정보는 아래에서 확인하실 수 있습니다.
 
 
프밍 스터디는 Udemy Korea와 함께 합니다.
 
 

 
 
원하는 스터디가 없다면? 다른 스터디 개설 신청하기
누군가 아직 원하는 스터디를 개설하지 않았나요? 여러분이 직접 개설 신청 해 주세요!
이 포스트는
"실전문제로 배우는 머신러닝" 스터디의 진행 결과입니다
진행중인 스터디
실전문제로 배우는 머신러닝
머신러닝 실전 프로젝트를 매주 1개씩 진행하면서 실무 능력을 길러봅시다!
오혜수 멘토
안녕하세요! 저는 머신러닝에 관심 있는 취준생입니다!