[Python數據挖掘]第5章、挖掘建模(上)

1、分類和迴歸

迴歸分析研究的範圍大體以下:算法

一、邏輯迴歸

#邏輯迴歸 自動建模
import pandas as pd
from sklearn.linear_model import LogisticRegression as LR
from sklearn.linear_model import RandomizedLogisticRegression as RLR 

#參數初始化
data = pd.read_excel('data/bankloan.xls')
x = data.iloc[:,:8].as_matrix()        #loc和iloc是Pandas中用於提取數據的函數
y = data.iloc[:,8].as_matrix()
#複製一份,用做對比
x1=x
y1=y

rlr = RLR() #創建隨機邏輯迴歸模型,篩選變量
rlr.fit(x, y) #訓練模型
rlr.get_support() #獲取特徵篩選結果,也能夠經過.scores_方法獲取各個特徵的分數
print(u'經過隨機邏輯迴歸模型篩選特徵結束。')
print(u'有效特徵爲:%s' % ','.join(data.iloc[:,0:8].columns[rlr.get_support()]))    #原代碼此處報錯
x = data[data.iloc[:,0:8].columns[rlr.get_support()]].as_matrix() #篩選好特徵

lr = LR() #創建邏輯迴歸模型
lr.fit(x, y) #用篩選後的特徵數據來訓練模型
print(u'邏輯迴歸模型訓練結束。')
print(u'篩選特徵後,模型的平均正確率爲:%s' % lr.score(x, y)) #給出模型的平均正確率,本例爲81.4%

lr1 = LR() 
lr1.fit(x1, y1) #直接用原始數據來訓練模型
print(u'未篩選特徵,模型的平均正確率爲:%s' % lr1.score(x1, y1)) 
經過隨機邏輯迴歸模型篩選特徵結束。
有效特徵爲:工齡,地址,負債率,信用卡負債
邏輯迴歸模型訓練結束。
篩選特徵後,模型的平均正確率爲:0.814285714286
未篩選特徵,模型的平均正確率爲:0.805714285714

二、決策樹

#使用ID3決策樹算法預測銷量高低
import pandas as pd

#參數初始化
data = pd.read_excel('data/sales_data.xls', index_col = '序號') #導入數據

#數據是類別標籤,要將它轉換爲數據
#用1來表示「好」、「是」、「高」這三個屬性,用-1來表示「壞」、「否」、「低」
data.replace(['','','','','',''],[1,1,1,-1,-1,-1],inplace=True)
x = data.iloc[:,:3]
y = data.iloc[:,3]

from sklearn.tree import DecisionTreeClassifier as DTC
dtc = DTC(criterion='entropy') #創建決策樹模型,基於信息熵
dtc.fit(x, y) #訓練模型

#導入相關函數,可視化決策樹。
#導出的結果是一個dot文件,須要安裝Graphviz才能將它轉換爲pdf或png等格式。
from sklearn.tree import export_graphviz
x = pd.DataFrame(x)
from sklearn.externals.six import StringIO
x = pd.DataFrame(x)
with open("tree.dot", 'w') as f:
  f = export_graphviz(dtc, feature_names = x.columns, out_file = f)

運行上述代碼,生成tree.dot文件,對其稍做修改網絡

獲得決策樹的可視化併發

三、人工神經網絡

#使用神經網絡算法預測銷量高低
import pandas as pd
from sklearn.metrics import confusion_matrix #導入混淆矩陣函數
import matplotlib.pyplot as plt #導入做圖庫
from keras.models import Sequential
from keras.layers.core import Dense, Activation

#做圖函數
def cm_plot(y, yp):
    cm = confusion_matrix(y, yp) #混淆矩陣 
    plt.matshow(cm, cmap=plt.cm.Greens) #畫混淆矩陣圖,配色風格使用cm.Greens,更多風格請參考官網。
    plt.colorbar() #顏色標籤
  
    for x in range(len(cm)): #數據標籤
        for y in range(len(cm)):
            plt.annotate(cm[x,y], xy=(x, y), horizontalalignment='center', verticalalignment='center')
  
    plt.ylabel('True label') #座標軸標籤
    plt.xlabel('Predicted label') #座標軸標籤
    return plt

#參數初始化
data = pd.read_excel('data/sales_data.xls', index_col = '序號') #導入數據

#數據是類別標籤,要將它轉換爲數據
#用1來表示「好」、「是」、「高」這三個屬性,用0來表示「壞」、「否」、「低」
data.replace(['','','','','',''],[1,1,1,0,0,0],inplace=True)
x = data.iloc[:,:3]
y = data.iloc[:,3]

model = Sequential() #創建模型
model.add(Dense(input_dim = 3, output_dim = 10))
model.add(Activation('relu')) #用relu函數做爲激活函數,可以大幅提供準確度
model.add(Dense(input_dim = 10, output_dim = 1))
model.add(Activation('sigmoid')) #因爲是0-1輸出,用sigmoid函數做爲激活函數

model.compile(loss = 'binary_crossentropy', optimizer = 'adam')
#編譯模型。因爲咱們作的是二元分類,因此咱們指定損失函數爲binary_crossentropy,以及模式爲binary
#另外常見的損失函數還有mean_squared_error、categorical_crossentropy等,請閱讀幫助文件。
#求解方法咱們指定用adam,還有sgd、rmsprop等可選

model.fit(x, y, nb_epoch = 1000, batch_size = 10) #訓練模型,學習一千次
yp = model.predict_classes(x).reshape(len(y)) #分類預測

cm_plot(y,yp).show() #顯示混淆矩陣可視化結果

2、評價指標

 

Accuracy表示你有多少比例的樣本預測對了 dom

Precision表示你預測爲正的樣本中有多少預測對了,又稱爲查準率函數

Recall表示真實標籤爲正的樣本有多少被你預測對了,又稱爲查全率工具

3、聚類分析

 

#-*- coding: utf-8 -*-
#使用K-Means算法聚類消費行爲特徵數據
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

#參數初始化
data = pd.read_excel('data/consumption_data.xls', index_col = 'Id') #讀取數據
outputfile = 'tmp/data_type.xls' #保存結果的文件名

k = 3 #聚類的類別
iteration = 500 #聚類最大循環次數
data_zs = 1.0*(data - data.mean())/data.std() #數據標準化

model = KMeans(n_clusters = k, n_jobs = 4, max_iter = iteration) #分爲k類,併發數4
model.fit(data_zs) #開始聚類

#簡單打印結果
r1 = pd.Series(model.labels_).value_counts() #統計各個類別的數目
r2 = pd.DataFrame(model.cluster_centers_) #找出聚類中心
r = pd.concat([r2, r1], axis = 1) #橫向鏈接(0是縱向),獲得聚類中心對應的類別下的數目
r.columns = list(data.columns) + [u'類別數目'] #重命名錶頭
print(r)

#詳細輸出原始數據及其類別
r = pd.concat([data, pd.Series(model.labels_, index = data.index)], axis = 1)  #詳細輸出每一個樣本對應的類別
r.columns = list(data.columns) + [u'聚類類別'] #重命名錶頭
r.to_excel(outputfile) #保存結果


def density_plot(data,title): #自定義做圖函數
    plt.figure()
    for i in range(len(data.iloc[0])):#逐列做圖
        (data.iloc[:,i]).plot(kind='kde', label=data.columns[i],linewidth = 2)
    plt.ylabel('密度')
    plt.xlabel('人數')
    plt.title('聚類類別%s各屬性的密度曲線'%title)
    plt.legend()
    return plt

def density_plot(data): #自定義做圖函數
    p = data.plot(kind='kde', linewidth = 2, subplots = True, sharex = False)
    [p[i].set_ylabel(u'密度') for i in range(k)]
    plt.legend()
    return plt

pic_output = 'tmp/pd_' #機率密度圖文件名前綴
for i in range(k):
  density_plot(data[r[u'聚類類別']==i]).savefig(u'%s%s.png' %(pic_output, i))

聚類效果評價

聚類可視化工具——TSNE(在2維或3維空間展現聚類效果)

#代碼接上面
from sklearn.manifold import TSNE

tsne = TSNE()
tsne.fit_transform(data_zs) #進行數據降維
tsne = pd.DataFrame(tsne.embedding_, index = data_zs.index) #轉換數據格式

#不一樣類別用不一樣顏色和樣式繪圖
d = tsne[r[u'聚類類別'] == 0]
plt.plot(d[0], d[1], 'r.')
d = tsne[r[u'聚類類別'] == 1]
plt.plot(d[0], d[1], 'go')
d = tsne[r[u'聚類類別'] == 2]
plt.plot(d[0], d[1], 'b*')
plt.show()

相關文章
相關標籤/搜索