王茂發(fā) 王子民 汪華登 劉振丙
(桂林電子科技大學(xué)計算機(jī)與信息安全學(xué)院,廣西 桂林 541004)
Jupyter Notebook是一個開源的Web應(yīng)用程序,可用于創(chuàng)建和共享包含實代碼、公式、可視化和敘述文本的文檔。其用途包括:數(shù)據(jù)清洗和轉(zhuǎn)換、數(shù)值模擬、統(tǒng)計建模、數(shù)據(jù)可視化、機(jī)器學(xué)習(xí)、深度學(xué)習(xí)、元學(xué)習(xí)等。當(dāng)前,在Jupyter平臺下最為流行的應(yīng)用方式之一,即為采用Python語言結(jié)合各種機(jī)器學(xué)習(xí)工具包進(jìn)行數(shù)據(jù)挖掘開發(fā)和教學(xué)。
選擇Jupyter為數(shù)據(jù)挖掘課程的教學(xué)和實踐平臺有以下5個優(yōu)點(diǎn):(1)代碼與結(jié)果展示一體融合,教與學(xué)的結(jié)果即時呈現(xiàn);(2)支持當(dāng)下最為流行的Python語言及其各種數(shù)值分析、數(shù)據(jù)處理和機(jī)器學(xué)習(xí)、深度學(xué)習(xí)開發(fā)包[1,2],如:Numpy、Pandas、Scikit-learn、Tensorflow、Pytorch、Keras等;(3)支持以網(wǎng)頁的形式分享,并對多種格式無縫兼容,如:HTML、Markdown、PDF、Python源碼等;(4)分布式運(yùn)行,在數(shù)據(jù)挖掘教學(xué)過程中,可以利用本地資源、遠(yuǎn)程資源、共享資源同時進(jìn)行代碼運(yùn)行和展示,進(jìn)而屏蔽課堂對于各種復(fù)雜運(yùn)行環(huán)境配置和安裝的要求,進(jìn)而實現(xiàn)一處安裝到處輕松講課和完美展示的效果;(5)交互式展現(xiàn),不僅可以輸出圖片、視頻、數(shù)學(xué)公式,還可以通過交互式插件呈現(xiàn)可互動的可視化內(nèi)容,比如可縮放的地圖和可旋轉(zhuǎn)的三維模型,進(jìn)而實現(xiàn)理論與實踐同步,便于全過程開展沉浸式數(shù)據(jù)挖掘教學(xué),甚至完全代替?zhèn)鹘y(tǒng)的PPT教學(xué)。
數(shù)據(jù)挖掘是計算機(jī)等專業(yè)必選課之一[3,4]。數(shù)據(jù)挖掘又稱知識發(fā)現(xiàn),是一個從海量數(shù)據(jù)中根據(jù)某種法則抽取的,有價值或知識的數(shù)據(jù)的過程。它包括數(shù)據(jù)清洗、數(shù)據(jù)集成、數(shù)據(jù)轉(zhuǎn)換、數(shù)據(jù)挖掘、模式評估和知識表示等部分。數(shù)據(jù)挖掘涉及數(shù)據(jù)庫技術(shù)、機(jī)器學(xué)習(xí)、人工神經(jīng)網(wǎng)絡(luò)、統(tǒng)計學(xué)、模式識別、運(yùn)籌與優(yōu)化、面向?qū)ο缶幊痰榷鄠€學(xué)科中的知識。它的挖掘?qū)ο罂梢允菆D像、文本、影音、數(shù)據(jù)庫、數(shù)據(jù)倉庫、Web數(shù)據(jù)庫等。就功能而言,數(shù)據(jù)挖掘主要是對所挖掘?qū)ο笾械臄?shù)據(jù)進(jìn)行概念描述、關(guān)聯(lián)規(guī)則的獲取、分類與預(yù)測、聚類分析、孤立點(diǎn)的發(fā)現(xiàn)、模式評估等。
通過本課程的學(xué)習(xí)可使學(xué)生獲得數(shù)據(jù)挖掘的基本理論、基本知識和基本技能、樹立理論聯(lián)系實際的工程觀點(diǎn),培養(yǎng)學(xué)生用人工智能的方法和觀點(diǎn)分析和解決數(shù)據(jù)領(lǐng)域問題的能力,同時為學(xué)生后續(xù)學(xué)習(xí)深度學(xué)習(xí)、機(jī)器學(xué)習(xí)等專業(yè)課程提供必要的基礎(chǔ)知識、理論背景和平臺經(jīng)驗[5,6]。
基于Jupyter開展數(shù)據(jù)挖掘教學(xué)實踐,有異于傳統(tǒng)的教學(xué)方法,如:(1)可以少用或不用PPT展示;(2)算法講解和代碼演示可以同時進(jìn)行,理論教學(xué)和實踐教學(xué)須合二為一;(3)近年來,基于Jupyter平臺的開發(fā)各種數(shù)據(jù)挖掘、機(jī)器學(xué)習(xí)算法和模型工具包層出不窮、日新月異,如XGBoost、LightGBM等模型在Kaggle等數(shù)據(jù)競賽平臺上被廣泛應(yīng)用,最新的數(shù)據(jù)挖掘教學(xué)內(nèi)容必須予以動態(tài)體現(xiàn)這些最新的變化[7,8]。
在Jupyter環(huán)境,教學(xué)大綱和教學(xué)安排須進(jìn)一步體現(xiàn)以下兩點(diǎn)要求:(1)理論和實踐無縫鏈接,緊密結(jié)合,同步進(jìn)行,有條件布置好遠(yuǎn)程服務(wù)器教與學(xué)可同時在終端上進(jìn)行,教的內(nèi)容即時呈現(xiàn),學(xué)的東西即時實踐;(2)為了體現(xiàn)平臺優(yōu)勢,需要在基礎(chǔ)教學(xué)內(nèi)容中安排若干課時,講授Python基礎(chǔ)、數(shù)值處理工具Numpy、數(shù)據(jù)處理工具Pandas和Scikit-learn下的基本數(shù)據(jù)挖掘工具包。進(jìn)而將基于Jupyter環(huán)境下的數(shù)據(jù)挖掘教學(xué)大綱分為基礎(chǔ)和提升兩部分,其中基礎(chǔ)教學(xué)內(nèi)容主要培養(yǎng)學(xué)生基本的數(shù)據(jù)收集、數(shù)據(jù)分析、數(shù)據(jù)處理、數(shù)據(jù)清洗、數(shù)據(jù)可視化能力,主要的講授內(nèi)容有:數(shù)據(jù)挖掘概論、Python基礎(chǔ)、Numpy與Pandas、爬蟲技術(shù)基礎(chǔ)、數(shù)據(jù)清洗、數(shù)據(jù)可視化。提升教學(xué)內(nèi)容主要培養(yǎng)學(xué)生針對具體任務(wù)的數(shù)據(jù)挖掘能力,主要講授內(nèi)容有:分類、聚類、回歸、關(guān)聯(lián)規(guī)則、深度學(xué)習(xí)、元學(xué)習(xí)初步。一般來說,針對本科生開設(shè)的數(shù)據(jù)挖掘課程總學(xué)時控制在32~40學(xué)時之間為宜[9,10],表1給出了建議的教學(xué)大綱。
表1 教學(xué)大綱
下面以數(shù)據(jù)挖掘中常用的K近鄰(KNN)模型為例,詳細(xì)闡述如何利用Jupyter為載體開展數(shù)據(jù)挖掘課堂教學(xué)。
(1)基礎(chǔ)概念
KNN模型是一種有監(jiān)督的學(xué)習(xí)算法,中文名稱為K最近鄰算法。它屬于“惰性”學(xué)習(xí)算法,即不會預(yù)先生成一個分類或預(yù)測模型,用于新樣本的預(yù)測,而是將模型的構(gòu)建與未知數(shù)據(jù)的預(yù)測同時進(jìn)行。該算法既可以針對離散因變量做分類,又可以對連續(xù)因變量做預(yù)測,其核心思想就是比較已知y值的樣本與未知y值樣本的相似度,然后尋找最相似的k個樣本,用作未知樣本的y值預(yù)測。
首先,介紹一下KNN的算法原理和流程步驟。如圖1所示,模型的本質(zhì)就是尋找k個最近樣本,然后基于最近樣本做“預(yù)測”。對于離散型的因變量來說,從k個最近的已知類別樣本中挑選出頻率最高的類別用于未知樣本的判斷;對于連續(xù)型的因變量來說,則是將k個最近的已知樣本均值用作未知樣本的預(yù)測。以分類問題為例,具體算法步驟如下:
圖1 KNN算法示意圖
1)確定未知樣本近鄰的個數(shù)k值;
2)根據(jù)某種度量樣本間相似度的指標(biāo)(如歐氏距離)將每一個未知類別樣本的最近k個已知樣本搜尋出來,形成一個個簇;
3)對搜尋出來的已知樣本進(jìn)行投票,將各簇下類別最多的分類用作未知樣本點(diǎn)的預(yù)測。
接下來,可以向?qū)W生具體講授K值的選擇方法,及具體度量算法(如歐式距離、曼哈頓距離、余弦相似度、卡德相似系數(shù)等),這里不再做具體展開,我們重點(diǎn)介紹下如何使用Jupyter進(jìn)行算法的演示教學(xué)。
(2)基于Jupyter教學(xué)
這里通過針對UCI提供的學(xué)生學(xué)習(xí)過程記錄數(shù)據(jù),搭建KNN模型,預(yù)測學(xué)生的知識掌握程度(Very Low、Low、Middle和High)來演示基于Jupyter的教學(xué)過程。首先,使用markdown語言列出可能用到的基礎(chǔ)模塊包,并對每個模塊包進(jìn)行詳細(xì)介紹,如圖2所示,為后續(xù)模型代碼的開發(fā)打下堅實的基礎(chǔ)。
圖2 可能用到的基礎(chǔ)包說明和加載
接著,導(dǎo)入數(shù)據(jù),并預(yù)覽一下該數(shù)據(jù)集的前幾行,使得學(xué)生對數(shù)據(jù)集有一個更為清晰和直觀的認(rèn)識,代碼及運(yùn)行結(jié)果如圖3所示,通過這種方式可以讓學(xué)生清晰地看到數(shù)據(jù)的基本結(jié)構(gòu)。數(shù)據(jù)集一共包含403個觀測對象和6個變量,首先前5列分別為學(xué)員在目標(biāo)學(xué)科上的學(xué)習(xí)時長(STG)、重復(fù)次數(shù)(SCG)、學(xué)習(xí)時長(STR)、兩個相關(guān)科目的考試成績(LPR和PEG);最后1列是學(xué)員對知識掌握程度(UNS),一共含有四種不同的值,分別為Very Low、Low、Middle和High。
圖3 數(shù)據(jù)導(dǎo)入和展示
繼續(xù)將導(dǎo)入的樣本按照3:1拆分成訓(xùn)練集和測試集,如圖4所示。這里要注意講解函數(shù)model_selection.train_test_split的幾個參數(shù)的意義:第1個參數(shù)是自變量,第2個參數(shù)是因變量,test_size表示測試樣本所占的百分比,最后一個參數(shù)random_state表示隨機(jī)數(shù)發(fā)生器的種子。
圖4 數(shù)據(jù)拆分
接著進(jìn)行K值選擇,具體代碼如圖5所示。采用10重交叉驗證,測試不同的K值對應(yīng)的KNN模型的平均準(zhǔn)確率。這里要給學(xué)生講清楚K取值上限的計算方法:用樣本總量求以2為底的對數(shù)。最終通過圖示法給出最佳的K值,這里取5,如圖6所示。
圖5 交叉驗證法確定KNN模型最終的K值
圖6 不同K值對應(yīng)的KNN模型的效果分析
再接下來,構(gòu)造混淆矩陣,并可視化,如圖7所示?;煜仃嚨膶蔷€數(shù)值是各個分類預(yù)測準(zhǔn)確的樣本量。利用混淆矩陣的可視化結(jié)果,讓學(xué)生理解每個分類的召回率、準(zhǔn)確率的概念和相互區(qū)別。
圖7 構(gòu)造最佳KNN模型的預(yù)測結(jié)果的混淆矩陣
最后通過Jupyter給出最終模型的準(zhǔn)確率和模型效能的評估,并講述每個指標(biāo)的具體含義,如圖8所示。
圖8 模型結(jié)果分析
通過以上基于Jupyter的代碼和結(jié)果講述過程,可以讓學(xué)生對KNN模型的建模、實驗、結(jié)果分析有一個非常直觀的認(rèn)識,從而建立起EDA分析、數(shù)據(jù)建模到結(jié)論分析一整套標(biāo)準(zhǔn)建模思想。
基于Jupyter,既可以開展理論與實踐過程的教學(xué),也可以開展課后作業(yè)及期末考核工作。
在課后作業(yè)的布置環(huán)節(jié),可將作業(yè)以數(shù)據(jù)+任務(wù)的形式進(jìn)行線下部署,要求學(xué)生以Juypter形式進(jìn)行EDA分析、模型建模和結(jié)果展示及分析,最終以Juypter網(wǎng)頁形式進(jìn)行統(tǒng)一發(fā)布或截屏上傳,這種方式非常有利于學(xué)生數(shù)據(jù)建模連續(xù)思維的培養(yǎng),也有利于教師進(jìn)行線上作業(yè)檢查,全面評估學(xué)生的實操能力。
在期末考核環(huán)節(jié),可以將典型的數(shù)據(jù)分析和建模案例以Jupyter形式發(fā)布,具體可以填空、判斷、結(jié)論預(yù)測與分析等方式出題,全面考察學(xué)生數(shù)據(jù)挖掘過程中對各個具體知識節(jié)點(diǎn)的掌握程度。
數(shù)據(jù)挖掘是計算機(jī)大類學(xué)科,尤其是人工智能方向必修課之一,也是學(xué)生走入機(jī)器學(xué)習(xí)的入門課,課程的內(nèi)涵和實用價值都非常大。如何在實戰(zhàn)環(huán)境下方便自如地開展理論與實踐教學(xué)一直是一個痛點(diǎn)問題。本文首先介紹了Jupyter平臺,然后針對數(shù)據(jù)挖掘課程教與學(xué)過程中普遍存在的問題,進(jìn)行了系統(tǒng)分析和方案研究。主要從教學(xué)大綱、課堂組織、考核手段等環(huán)節(jié)進(jìn)行闡述,啟發(fā)教師的備課思路和方法,目的提升學(xué)生的數(shù)據(jù)挖掘課程的學(xué)習(xí)興趣,拓展數(shù)據(jù)挖掘課程教學(xué)研究的廣度和深度。