1. 程式人生 > >『Python資料分析與挖掘實戰』第五章:挖掘建模

『Python資料分析與挖掘實戰』第五章:挖掘建模

# coding:utf-8
"""
logistic 迴歸, 自動建模
"""
import pandas as pd

# 引數初始化
filename = r"C:\learning\DataMining\Book\Python_DataMining\Data\chapter5\demo\data\bankloan.xls"
data = pd.read_excel(filename)
x = data.iloc[:, : 8].as_matrix()     # 此處的 [:, : 8] 的意思是,切片所有的行和 1- 8列的資料  # 此處的 as_matrix 函式是
# 將資料框資料結構轉換為使用陣列的資料結構
print "x: \n", x
y = data.iloc[:, 8].as_matrix()    # 此處的 [:, 8] 的意思是, 切片所有的行和第 9 列 ,注:這裡的數字實際上是第 n 列 - 1
print "y: \n", y

from sklearn.linear_model import LogisticRegression as LR
from sklearn.linear_model import RandomizedLogisticRegression as RLR

rlr = RLR()    # 建立隨機邏輯迴歸模型,篩選變數 # 可以使用引數設定閾值: selection_threshold = 0.5 等

rlr.fit(x, y)  # 訓練模型
rlr.get_support()    # 獲取特徵篩選結果,也可以通過 .scoress_方法獲取各個特徵的分數
print u"通過隨機邏輯迴歸模型篩選特徵結束"
print u"有效特徵為: %s " % ",".join(data.columns[rlr.get_support()])
x = data[data.columns[rlr.get_support()]].as_matrix()    # 篩選好特徵

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

        邏輯迴歸本質上還是一種線性模型,因此這裡的模型有效性檢驗本質上還是在做線性相關檢驗,因此,所篩選出來的變數,說明與結果具有比較強的相關性,然而被篩掉的變數不一定就跟結果沒有關係,因為它們之間有可能是非線性關係。對於非線性關係的變數篩選方法有決策樹、神經網路等。

# coding:utf-8
# 使用神經網路演算法預測銷量高低

import pandas as pd

# 引數初始化
inputfile = r"C:\learning\DataMining\Book\Python_DataMining\Data\chapter5\demo\data\sales_data.xls"
data = pd.read_excel(inputfile, index_col=u"序號")
print "data: \n", data

# 資料是類別標籤,要將它轉換為資料
# 用 1 來表示“好”, “是”, “高” 這 3 個屬性,用 0 來表示“壞”, “否”, “低”
data[data == u"好"] = 1
data[data == u"是"] = 1
data[data == u"高"] = 1
data[data != 1] = 0
print "data_2: \n", data
print data.dtypes

x = data.iloc[:, : 3].as_matrix().astype(int)    # astype 函式將資料轉換為指定型別
print "x: \n", x
print "len_x: ", len(x)
y = data.iloc[:, 3].as_matrix().astype(int)
print "y: \n", y
print "len_y: ", len(y)

from keras.models import Sequential
from keras.layers.core import Dense, Activation

model = Sequential()    # 建立模型
model.add(Dense(input_dim=3, output_dim=10))     # 新增 3 個輸入節點, 10 個隱藏節點
model.add(Activation("relu"))    # 用 relu 函式作為啟用函式,能夠大幅提高準確度

model.add(Dense(output_dim=1))    # 新增一個輸出節點
model.add(Activation("sigmoid"))    # 由於是 0-1 輸出,用 sigmoid 函式作為啟用函式

model.compile(loss="binary_crossentropy", optimizer="adam", class_mode="binary")
# 編譯模型。由於我們做的是二元分類,所以我們指定損失函式為 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))    # 分類預測

from cm_plot import *     # 匯入自行編寫的混淆矩陣視覺化函式
cm_plot(y, yp).show()

        需要注意的是,準確率只有 76.4,這是由於神經網路訓練時需要較多樣本,而這裡是由於訓練資料較少造成的

5.16

    模型預測效果評價,通常用相對/絕對誤差、平均絕對誤差、均方誤差、均方根誤差等指標來衡量

    均方誤差中由於加大了數值大的誤差在指標中的作用,從而提高了這個指標的靈敏性,是一大優點

    識別準確度:

    Accuracy = (TP + FN) / (TP + TN + FP + FN) * 100%

    式中各項說明如下:

    TP:正確的肯定表示正確肯定的分類數,即正確的被分類為正確

    TN:正確的否定表示正確否定的分類數,即錯誤的被分類為錯誤

    FP:錯誤的肯定表示錯誤肯定的分類數,即錯誤的被分類為正確

    FN:錯誤的否定表示錯誤否定的分類數,即正確的被分類為錯誤

    識別精確率:

    Precision = TP / (TP + FP) * 100%