更新內容:第4點c方式
計算準確率的方式(用了sklearn方式)
由于每個算法都基于某些特定的假設,且均含有某些缺點,因此需要通過大量的實踐為特定的問題選擇合適的算法。可以這么說:沒有任何一種分類器可以在所有的情況下都有良好的表現。
分類器的性能,計算能力,預測能力在很大程度上都依賴于用于模型的相關數據。訓練機器學習算法涉及到五個主要的步驟:
- 1.特征的選擇
- 2.確定性能評價標準
- 3.選擇分類器及其優化算法
- 4.對模型性能的評估
- 5.算法的調優
寫在前面:接下來的我們通過一些電信數據來看看一些常用的分類器的簡單情況(默認參數),通過這些分類器來預測客戶是否會流失。這次是一些比較簡單的做法,有空再來完善,比如超參調優等。
1.加載數據
數據下載鏈接https://pan.baidu.com/s/1bp8nloV
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")
結果如下
可以看到決策樹最先是以訓練集中的第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
寫在最后:從準確率上看,這份數據決策樹分類器的泛化能力最好,但是我們這里用的是各個分類器的默認參數,沒有進行相關檢驗,調優,所以目前的結果并不可信,也不能完全按照準確率去比較分類器的優劣