一小時(shí)開(kāi)發(fā)數(shù)據(jù)分析和機(jī)器學(xué)習(xí)平臺(tái)(手把手,附Python代碼)

設(shè)計(jì)一個(gè)網(wǎng)頁(yè)版的用戶界面,支持交互
支持從本地選取數(shù)據(jù)集
支持自動(dòng)化可視化分析
支持回歸分析和分類分析,機(jī)器學(xué)習(xí)算法多樣
支持查看訓(xùn)練記錄
支持查看所有訓(xùn)練模型的參數(shù),結(jié)果,甚至繪圖
支持預(yù)測(cè)新數(shù)據(jù)集
支持其他機(jī)器學(xué)習(xí)任務(wù)(比如異常檢測(cè),規(guī)則關(guān)聯(lián),自然語(yǔ)言處理)
其他細(xì)節(jié)

既有的組件方便快速設(shè)計(jì)網(wǎng)頁(yè):
該庫(kù)已經(jīng)內(nèi)置很多組件,比如文本輸入,側(cè)邊欄,按鈕,滑塊,圖畫顯示等組件。
調(diào)用方式也很簡(jiǎn)單,就是單個(gè)函數(shù)即可。
部署和運(yùn)行方便:只需要一個(gè)命令即可--> streamlit run main.py
pip install streamlitpip install streamlit_pandas_profilingpip install pycaret
main.py 我們的代碼
data 文件夾用于放置示例數(shù)據(jù)集,可不用
mlruns 文件夾 ,用于管理訓(xùn)練的機(jī)器學(xué)習(xí)模塊記錄,系統(tǒng)會(huì)自動(dòng)生成
logs.log 用于記錄系統(tǒng)日志

import streamlit as st # 用于設(shè)計(jì)網(wǎng)頁(yè)import pandas as pdfrom pandas_profiling import ProfileReport # 用于生成報(bào)表from streamlit_pandas_profiling import st_profile_report # 用于在streamlit中顯示報(bào)表import osimport pycaret.classification as pc_cl # 自動(dòng)機(jī)器學(xué)習(xí)分類import pycaret.regression as pc_rg # 自動(dòng)機(jī)器學(xué)習(xí)回歸import mlflow # 模型管理
接下來(lái)我們需要準(zhǔn)備幾個(gè)輔助函數(shù),這些函數(shù)主要是用于處理一些用戶交互的細(xì)節(jié)。
逐行讀取logs.log,顯示最末選定行數(shù),用戶可以設(shè)定行數(shù)。
def get_model_training_logs(n_lines = 10):file = open('logs.log', 'r')lines = file.read().splitlines()file.close()return lines[-n_lines:]
獲取當(dāng)前路徑下特定類型的文件列表,比如data文件夾的所有csv文件
def list_files(directory, extension):
# list certain extension files in the folder
return [f for f in os.listdir(directory) if f.endswith('.' + extension)]
獲取文件的完整路徑,用于讀取數(shù)據(jù)集
def concat_file_path(file_folder, file_selected):# handle the folder path with '/' or 'without './'# and concat folder path and file pathif str(file_folder)[-1] != '/':file_selected_path = file_folder + '/' + file_selectedelse:file_selected_path = file_folder + file_selectedreturn file_selected_path
加載數(shù)據(jù)集,注意這里為了軟件的性能,會(huì)將數(shù)據(jù)集放入緩存,重復(fù)加載同一數(shù)據(jù)集不會(huì)重復(fù)占用系統(tǒng)資源。
@st.cache(suppress_st_warning=True)def load_csv(file_selected_path, nrows):# load certain rowstry:if nrows == -1:df = pd.read_csv(file_selected_path)else:df = pd.read_csv(file_selected_path, nrows=nrows)except Exception as ex:df = pd.DataFrame([])st.exception(ex)return df
主程序包含了網(wǎng)頁(yè)相關(guān)的界面設(shè)計(jì)以及用戶操作響應(yīng),主要是選取合適的streamlit組件以及觸發(fā)相應(yīng)的函數(shù)。

下圖是網(wǎng)頁(yè)側(cè)邊欄(功能欄)設(shè)計(jì)的組件選擇,側(cè)邊欄的設(shè)計(jì)是重中之重,因?yàn)樗婕爸饕δ苣K,需要根據(jù)用戶的操作來(lái)執(zhí)行相應(yīng)的函數(shù)。

當(dāng)“定義數(shù)據(jù)源”的checkbox被勾選后,相應(yīng)的功能才被激活,用戶才可以執(zhí)行后續(xù)動(dòng)作:
輸入文件夾路徑,這里支持相對(duì)路徑,比如輸入data,表示讀取當(dāng)前路徑下的data文件夾
文件夾路徑輸入后(回車鍵),系統(tǒng)會(huì)自動(dòng)讀取所選文件夾的csv文件,并且將文件名列出到下拉列表。
在輸入行數(shù)中可以選擇需要讀取的行數(shù)。

if st.sidebar.checkbox('定義數(shù)據(jù)源'):file_folder = st.sidebar.text_input('文件夾', value="data")data_file_list = list_files(file_folder, 'csv')if len(data_file_list) ==0:st.warning(f'當(dāng)路徑無(wú)可用數(shù)據(jù)集')else:file_selected = st.sidebar.selectbox('選擇文件', data_file_list)file_selected_path = concat_file_path(file_folder, file_selected)nrows = st.sidebar.number_input('行數(shù)', value=-1)n_rows_str = '全部' if nrows == -1 else str(nrows)st.info(f'已選擇文件:{file_selected_path},讀取行數(shù)為{n_rows_str}')else:file_selected_path = Nonenrows = 100st.warning(f'當(dāng)前選擇文件為空,請(qǐng)選擇。')
探索性分析相對(duì)簡(jiǎn)單,只需要一個(gè)按鈕即可。之后會(huì)調(diào)用pandas-profiling 來(lái)生成EDA的分析結(jié)果。pandas-profiling 的介紹可以看之前的文章:
if st.sidebar.checkbox('探索性分析'):if file_selected_path is not None:if st.sidebar.button('一鍵生成報(bào)告'):df = load_csv(file_selected_path, nrows)pr = ProfileReport(df, explorative=True)st_profile_report(pr)else:st.info(f'沒(méi)有選擇文件,無(wú)法進(jìn)行分析。')
快速建模部分核心是基于pycaret庫(kù),之前我們介紹過(guò)pycaret 庫(kù),它是很強(qiáng)大的自動(dòng)化機(jī)器學(xué)習(xí)工具,不僅支持回歸分析和分類預(yù)測(cè),而且支持自然語(yǔ)言處理,規(guī)則關(guān)聯(lián),聚類,異常檢測(cè)等學(xué)習(xí)任務(wù),后面這幾個(gè)模塊本demo中并沒(méi)有實(shí)現(xiàn),但是實(shí)施起來(lái)不是很難。
代碼部分相對(duì)容易,沒(méi)有什么技巧可言,主要是一些細(xì)節(jié)處理,比如需要從讀取的數(shù)據(jù)集Dataframe中獲取所有的列名,讓用戶選擇需要的目標(biāo)列。還有,回歸和分類算法支持的算法列表并不相同,需要根據(jù)所選的任務(wù)來(lái)動(dòng)態(tài)獲取算法列表。

最后就是用戶信息提醒,這里采用info,success,warning等組件提供給用戶系統(tǒng)的狀態(tài)信息。
我們通過(guò)配置pycaret,可以使過(guò)程日志保存在log中。

?為節(jié)省文章篇幅,代碼見(jiàn)文末源碼mlflow是一款獨(dú)立的,成熟的模型生命周期管理軟件。其中tracking 模塊可以記錄每一次運(yùn)行的參數(shù),運(yùn)行的結(jié)果,metrics,模型的保存,繪圖的保存等(當(dāng)然記錄哪些內(nèi)容都是需要配置的)。
pycaret中集成了mlflow 模塊,所以我們只需要在調(diào)用pycaret 創(chuàng)建模型時(shí),允許系統(tǒng)調(diào)用mlflow來(lái)管理我們的運(yùn)行記錄。
這里我們將mlflow的運(yùn)行日志通過(guò)dataframe顯示出來(lái),當(dāng)然更多的細(xì)節(jié)我們可以通過(guò)mlflow的網(wǎng)頁(yè)來(lái)查看,比如模型信息,繪圖等。
如果需要查看mlflow 服務(wù)器網(wǎng)頁(yè),需要在命令行中輸入以下代碼來(lái)啟動(dòng):
mlflow ui
模型在mlflow中保存為pkl格式,我們需要調(diào)用mlflow中的load_model函數(shù)來(lái)獲取模型的信息。pycaret的模型相比于一般的sklearn的模型,多了pipeline的(管道模型)信息,這個(gè)pipeline可以用于對(duì)數(shù)據(jù)集進(jìn)行預(yù)處理。
加載的模型支持predict 方法,因此我們只需要輸入數(shù)據(jù)集即可預(yù)測(cè)。這里為了節(jié)省布局控件,我們繼續(xù)采用“定義數(shù)據(jù)源”的數(shù)據(jù)集來(lái)進(jìn)行預(yù)測(cè)。
?為節(jié)省文章篇幅,代碼見(jiàn)文末源碼我們把上面的所有涉及網(wǎng)頁(yè)設(shè)計(jì)的代碼,放置在一個(gè)函數(shù)下,比如:
def app_main():#上面的所有涉及網(wǎng)頁(yè)的代碼
然后設(shè)置程序的入口代碼:
if __name__ == '__main__':app_main()
以上就是所有的代碼。
運(yùn)行程序我們只需要在當(dāng)前路徑下,在命令行輸入:
streamlit run main.py系統(tǒng)會(huì)在8501 端口下,運(yùn)行app,在瀏覽器中輸入網(wǎng)址即可運(yùn)行。


本文的代碼難度屬于入門級(jí)別,但是達(dá)成的效果卻是很實(shí)用。因?yàn)檫@樣的數(shù)據(jù)分析平臺(tái)在日常中絕對(duì)可用,而且很順手。如果需要擴(kuò)展自動(dòng)機(jī)器學(xué)習(xí)的任務(wù),比如自然語(yǔ)言處理,也很簡(jiǎn)單。只需要參考回歸或者分類的代碼即可,相信工作量不會(huì)超過(guò)10行代碼(多是復(fù)制粘貼),有興趣的朋友可以嘗試。
上述的源代碼都放在github上:bingblackbean/streamlit_pycaret
準(zhǔn)備寫本書(shū) 屬實(shí)逼真,決策樹(shù)可視化! 21個(gè)深度學(xué)習(xí)開(kāi)源數(shù)據(jù)集匯總! 耗時(shí)一個(gè)月,做了一個(gè)純粹的機(jī)器學(xué)習(xí)網(wǎng)站 用 Python 從 0 實(shí)現(xiàn)一個(gè)神經(jīng)網(wǎng)絡(luò) 40篇AI論文!附PDF下載,代碼、視頻講解
三連在看,月入百萬(wàn)??
