python調用sklearn庫BP神經網絡基於小樣本進行痘痘預測嘗試

背景:

MLPClassifier() BP神經網絡

曾幾何時,在學數學建模,看他人用了一次svm分類。自那刻起,遂在心中埋下種子:我本渣渣何時可用得高大上的神經網絡等牛X算法啊。
這個暑假有幸接觸到Anaconda,甚至不知道具體怎麼念,自己慢慢瞎摸亂搜慢慢學嘛。這個sklearn庫,有點厲害。只需調用通過參數,解放了雙手去編算法,得以零基礎用機器學習。
本渣渣來到弗蘭臉上容易長痘。自己平常喜歡將各種生活狀態量化表示。遂有了自己的一個小excel。這個數據集100多天。
於是,我決定對嘗試下跨學科來進行醫療與機器學習。自己做的沒什麼價值的,但萬一言者無心,聽者有意呢

處理過程:

數據集

儘管數據少,而且我只用了辣椒和油炸兩個因素。我嘗試加進去起牀時間、天氣,嚴重拉低預測率,遂放棄。但睡眠時間也是稍微拉低一點。
首先展示部分樣本,我只用了油炸、辣椒兩個參數。(想要數據戳我,樂意奉獻本人數據)
在這裏插入圖片描述

證明下痘痘數據的真實性(自己每天記錄),還是有點正態分佈特徵:

在這裏插入圖片描述
我通過這個直方圖將痘痘分爲2,3,4,5。4個等級

數據標準化:

Excel標準化:

痘痘評分按上直方圖進行量化後
睡眠時間先轉浮點再通過excel表的if else if else…語句統一標準化

python的StandardScaler()標準化:

再次統一對訓練數據進行標準化操作

代碼時刻:

# -*- coding: utf-8 -*-
"""
Created on Tue Sep  3 19:10:07 2019
使用BP神經網絡模型
@author: yiqing
"""
#import numpy as np
import pandas as pd
#import matplotlib.pyplot as plt
from sklearn.metrics import classification_report
#from sklearn.metrics import roc_curve
#from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neural_network import MLPClassifier
#from sklearn.externals import joblib

def read():
    dates=pd.read_excel("D:\ziliao\jihua\日常記錄3月.xlsx",sheet_name=1)
    print(dates.iloc[:98,16:19])#代表矩陣的16至19行 矩陣從(0,0)開始
    x_train=dates.iloc[30:79,17:19]
    print("xtrain:/n",x_train)
    y_train=dates.iloc[30:79,23]*10
    x_test=dates.iloc[80:129,17:19]
    y_test=dates.iloc[80:129,23]*10
    # 神經網絡對數據尺度敏感,所以最好在訓練前標準化,或者歸一化,或者縮放到[-1,1]
    #數據標準化
    scaler = StandardScaler() # 標準化轉換
    scaler.fit(x_test)  # 訓練標準化對象
    x_test_Standard= scaler.transform(x_test)   # 轉換數據集
    scaler.fit(x_train)  # 訓練標準化對象
    x_train_Standard= scaler.transform(x_train)   # 轉換數據集
    #
    bp=MLPClassifier(hidden_layer_sizes=(500, ), activation='relu', 
    solver='lbfgs', alpha=0.0001, batch_size='auto', 
    learning_rate='constant')
    bp.fit(x_train_Standard,y_train.astype('int'))
    y_predict=bp.predict(x_test_Standard)
    
    y_test1=y_test.tolist()
    y_predict=list(y_predict)
    #print(int(y_test1[1]))
    for i in range(len(y_test1)):
        y_test1[i]=int(y_test1[i])
        
    print('BP網絡基於辣椒與油炸預測臉上痘痘評價報告:\n',classification_report(y_test.astype('int'),y_predict))
    print("真實數據:\t",y_test1)
    print("預測數據:\t",y_predict)

if __name__ == "__main__":
    read()


運行結果:

BP網絡基於辣椒與油炸預測臉上痘痘評價報告:
              precision    recall  f1-score   support

          2       0.00      0.00      0.00         0
          3       0.50      0.30      0.37        10
          4       0.85      0.89      0.87        38

avg / total       0.78      0.77      0.77        48

真實數據:    [4, 4, 4, 4, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 4, 4, 3]
預測數據:    [4, 4, 4, 4, 3, 3, 4, 4, 4, 4, 4, 4, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 2, 4]

結論:

瞎扯的
1)總預測率 78%還是不錯的,主要原因大部分都是4,太穩定了,數據還是太少,想預測難都難
2)油炸與辣椒較影響痘痘,但相關性不是特別強。
3)go to bed時刻與總睡眠時長次之
4)天氣、起牀時間毫無關係
5) 我覺得應該痘痘與前好幾天的飲食有關,正所謂冰凍一尺非一日之寒。
6) 個人認爲:情緒狀況、飲水、每日洗臉狀況也可考慮在內。
7) 一方水土養一方人,回家不長痘,覺得這是在家喝粥,在學校不喝粥主稻造成也有點關係
8)用藥。很有用。不過我沒記錄那幾天
9)自己記錄有失偏頗,無打分量準,完全看心情。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章