利用python進行分類-預測顧客流失(簡版)
更新內容:第4點c方式
計算準確率的方式(用了sklearn方式)
由於每個演算法都基於某些特定的假設,且均含有某些缺點,因此需要通過大量的實踐為特定的問題選擇合適的演算法。可以這麼說:沒有任何一種分類器可以在所有的情況下都有良好的表現。
分類器的效能,計算能力,預測能力在很大程度上都依賴於用於模型的相關資料。訓練機器學習演算法涉及到五個主要的步驟:
- 1.特徵的選擇
- 2.確定性能評價標準
- 3.選擇分類器及其優化演算法
- 4.對模型效能的評估
- 5.演算法的調優
寫在前面:接下來的我們通過一些電信資料來看看一些常用的分類器的簡單情況(預設引數),通過這些分類器來預測客戶是否會流失。這次是一些比較簡單的做法,有空再來完善,比如超參調優等。
1.載入資料
import pandas as pd
data = pd.read_csv("customer_churn.csv",header=0,index_col=0)
data.head()
但是在讀取的過程中出現瞭如下錯誤:
OSError:Initializing from file failed
查看了原始碼,應該是呼叫pandas的read_csv()方法時,預設使用C engine作為parser engine,而當檔名中含有中文的時候,用C engine在部分情況下就會出錯
所以解決方案有二:
- 1.將檔案路徑的中文替換掉
- 2.在read_csv中加入engine=‘python’引數,即:
data = pd.read_csv("C:\\Users\\Administrator\\OneDrive\\公開\\customer_churn.csv",header=0,index_col=0,engine='python')
2.檢視資料
data.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 3333 entries, 1 to 3333
Data columns (total 20 columns):
state 3333 non-null object
account_length 3333 non-null int64
area_code 3333 non-null object
international_plan 3333 non-null object
voice_mail_plan 3333 non-null object
number_vmail_messages 3333 non-null int64
total_day_minutes 3333 non-null float64
total_day_calls 3333 non-null int64
total_day_charge 3333 non-null float64
total_eve_minutes 3333 non-null float64
total_eve_calls 3333 non-null int64
total_eve_charge 3333 non-null float64
total_night_minutes 3333 non-null float64
total_night_calls 3333 non-null int64
total_night_charge 3333 non-null float64
total_intl_minutes 3333 non-null float64
total_intl_calls 3333 non-null int64
total_intl_charge 3333 non-null float64
number_customer_service_calls 3333 non-null int64
churn 3333 non-null object
dtypes: float64(8), int64(7), object(5)
memory usage: 546.8+ KB
3.特徵選取
特徵其實就是屬性、欄位等的意思
我們這裡採取比較簡單的方式,直接將state 、account_length 、area_code 這三列去掉,因為和是否流失的關係不大
data = data.ix[:,3:]
data.head()
4.將標稱特徵的值轉換為整數,方便演算法的運算
這裡的話我們有三種方式
- a.
var = ['international_plan', 'voice_mail_plan','churn']
for v in var:
data[v] = data[v].map(lambda a:1 if a=='yes' else 0)
- b
#可以用字典的方式
data = pd.read_csv("customer_churn.csv",header=0,index_col=0,engine='python')
data = data.ix[:,3:]
mapping = {'yes':1,'no':0}
var = ['international_plan', 'voice_mail_plan','churn']
for v in var:
data[v] = data[v].map(mapping)
- c
#或者也可以使用sklearn裡的LabelEncoder類
from sklearn.preprocessing import LabelEncoder
data = pd.read_csv("customer_churn.csv",header=0,index_col=0,engine='python')
data = data.ix[:,3:]
le = LabelEncoder()
var = ['international_plan', 'voice_mail_plan','churn']
for v in var:
data[v] = le.fit_transform(data[v])
data[var].head()
c方式我們可以用以下方式得出將yes和no分別轉換成了什麼整數
le.transform(['yes','no'])
結果
array([1, 0], dtype=int64)
5.將資料分為測試集和訓練集
X=data.ix[:,:-1]
y=data.ix[:,-1]
from sklearn.cross_validation import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=0)
6.1使用決策樹進行分類
#使用決策樹
from sklearn import tree
clf = tree.DecisionTreeClassifier(max_depth=3)
clf.fit(X_train,y_train)
我們可以通過以下方式將決策樹的圖匯出來,只是在python上相對R來說要麻煩一點,需要下載Graphviz軟體,並將其安裝目錄下的bin資料夾設定在系統變數中
#將決策樹的決策過程匯出到當前程式碼檔案所在資料夾
tree.export_graphviz(clf,out_file='tree3.dot')
再在cmd中輸入以下命令,將dot檔案轉換為png檔案
dot -T png tree.dot -o tree.png
因為本人用的是jupyter notebook,所以要想在jupyter notebookz中插入圖片的話,得用以下命令
%pylab inline
from IPython.display import Image
Image("tree.png")
結果如下
tree.png
可以看到決策樹最先是以訓練集中的第3列特徵進行分支的
#檢測分類結果
import numpy as np
print("Test accuracy:%.3f" %(np.sum(y_test==clf.predict(X_test))/len(y_test)))
結果為:Test accuracy:0.910
我們可以利用sklearn裡面的東西直接計算準確率
#1
print("Test accuracy:%.3f" % clf.score(X_test,y_test))
#2
from sklearn.metrics import accuracy_score
print("Test accuracy:%.3f" % accuracy_score(y_test,clf.predict(X_test)))
結果同樣都為0.910
6.2邏輯迴歸
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression()
clf.fit(X_train,y_train)
print("Test accuracy:%.3f" % clf.score(X_test,y_test))
結果為:Test accuracy:0.870
6.3支援向量機
#使用支援向量機
from sklearn.svm import SVC
clf = SVC()
clf.fit(X_train,y_train)
print("Test accuracy:%.3f" % clf.score(X_test,y_test))
結果為:Test accuracy:0.862
寫在最後:從準確率上看,這份資料決策樹分類器的泛化能力最好,但是我們這裡用的是各個分類器的預設引數,沒有進行相關檢驗,調優,所以目前的結果並不可信,也不能完全按照準確率去比較分類器的優劣