『Python資料分析與挖掘實戰』第五章:挖掘建模
阿新 • • 發佈:2019-01-10
# 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%