付東升
(廈門(mén)英才學(xué)校,福建 廈門(mén) 361000)
人臉識(shí)別、自動(dòng)駕駛、智能客服、短視頻推薦、金融風(fēng)控、智慧醫(yī)療、智慧農(nóng)業(yè)、機(jī)器人技術(shù)等,這些都是人工智能在各個(gè)行業(yè)中的具體應(yīng)用。人工智能涉及的范圍較廣,知識(shí)難度較大,根據(jù)目前人工智能叢書(shū)中所提出的內(nèi)容,主要以了解人工智能在生活中的應(yīng)用為主,或結(jié)合給定功能的開(kāi)源硬件,體驗(yàn)人工智能項(xiàng)目的應(yīng)用,往往不能真正理解人工智能中某個(gè)項(xiàng)目的原理,代碼編程項(xiàng)目設(shè)計(jì)更是無(wú)從下手,因此,本文嘗試以線性回歸項(xiàng)目為基礎(chǔ),開(kāi)展項(xiàng)目化的人工智能教學(xué),結(jié)合初中生認(rèn)知水平,從原理的講解到代碼的編寫(xiě),以期給中學(xué)人工智能教學(xué)以借鑒作用。
機(jī)器學(xué)習(xí)分為監(jiān)督學(xué)習(xí)、無(wú)監(jiān)督學(xué)習(xí)和強(qiáng)化學(xué)習(xí),其中監(jiān)督學(xué)習(xí)又包含回歸問(wèn)題和分類(lèi)問(wèn)題,線性回歸是機(jī)器學(xué)習(xí)中的經(jīng)典模型。初一學(xué)生對(duì)人工智能已有初步的了解和接觸,學(xué)生已達(dá)到學(xué)習(xí)機(jī)器學(xué)習(xí)基礎(chǔ)知識(shí)的認(rèn)知水平,本節(jié)將應(yīng)用Pycharm 編程軟件,通過(guò)Python 語(yǔ)言嘗試對(duì)“某城市房?jī)r(jià)問(wèn)題”這一線性回歸問(wèn)題做編程嘗試,學(xué)生在實(shí)際代碼的編寫(xiě)過(guò)程中探究線性回歸的基本原理,切身體驗(yàn)分析問(wèn)題、設(shè)計(jì)算法、編寫(xiě)程序、調(diào)試運(yùn)行的過(guò)程。
教師圍繞計(jì)算機(jī)解決問(wèn)題的一般過(guò)程:分析問(wèn)題、設(shè)計(jì)算法、編寫(xiě)程序、調(diào)試運(yùn)行與“導(dǎo)入相關(guān)的工具包、加載數(shù)據(jù)集、模型訓(xùn)練和預(yù)測(cè)、預(yù)測(cè)結(jié)果可視化”四個(gè)步驟進(jìn)行教學(xué)活動(dòng),具體教學(xué)過(guò)程有以下幾個(gè)方面。
2.1.1 提出問(wèn)題
中國(guó)人一般都有家的情節(jié),我們每天住在寬敞的房子中,有沒(méi)有想過(guò)能住在漂亮的房子里,是因?yàn)楦改感燎诘墓ぷ鳎炕氐絾?wèn)題上,現(xiàn)已知:20 世紀(jì)70年代中期,某城市郊區(qū)住宅的一些數(shù)據(jù)點(diǎn),比如犯罪率、當(dāng)?shù)胤慨a(chǎn)稅率等。
教師提出問(wèn)題:假設(shè)你是一個(gè)房地產(chǎn)商人,根據(jù)給定的一組關(guān)于郊區(qū)住宅的數(shù)據(jù)點(diǎn),如圖1所示,你能夠預(yù)測(cè)出其他住宅的售價(jià)為多少會(huì)更合適嗎
圖1 郊區(qū)住宅數(shù)據(jù)點(diǎn)
設(shè)計(jì)意圖:在情感態(tài)度價(jià)值觀上,學(xué)生能更理解父母工作的不易,只有付出才有回報(bào),同時(shí)基于問(wèn)題的教學(xué)法開(kāi)篇,拋出回歸問(wèn)題案例,激發(fā)學(xué)生興趣。
2.1.2 認(rèn)識(shí)數(shù)據(jù)集中存有哪些數(shù)據(jù)
(1)load_boston 數(shù)據(jù)集是以字典(Dictionary)的方式存儲(chǔ)數(shù)據(jù),使用以下三行代碼,可輸出load_boston 數(shù)據(jù)集中所含有的“鍵”,輸出結(jié)果如圖2所示。
圖2 load_boston 數(shù)據(jù)集中所含有的“鍵”
代碼:
設(shè)計(jì)意圖:引導(dǎo)學(xué)生深度挖掘某城市房?jī)r(jià)數(shù)據(jù),掌握其采用字典存儲(chǔ)方式的意義,即便于通過(guò)“鍵”查找其“值”,從而理解數(shù)據(jù)集中存儲(chǔ)的每一個(gè)“鍵”的含義。
數(shù)據(jù)集含有數(shù)據(jù)(506 個(gè)樣本,14 個(gè)屬性):主要為:數(shù)據(jù)(‘data’),目標(biāo)價(jià)格(‘target’),特征名稱(‘feature_names’)。
(2)引導(dǎo)學(xué)生思考數(shù)據(jù)集中字典的“值”是多少呢?應(yīng)用一行代碼,可以輸出完整的某城市數(shù)據(jù)集,輸出結(jié)果如圖3所示。
圖3 數(shù)據(jù)集中的數(shù)據(jù)
代碼:
print(dataset)
設(shè)計(jì)意圖:學(xué)生理解字典存儲(chǔ)數(shù)據(jù)意義的基礎(chǔ)上,輸出完整數(shù)據(jù),清楚認(rèn)識(shí)“鍵”和其所對(duì)應(yīng)的“值”,只有深度了解數(shù)據(jù)集中的數(shù)據(jù),才能便于調(diào)用數(shù)據(jù)。
(1)我們提取住宅平均房間數(shù)這一個(gè)特征(rooms)作為橫坐標(biāo)值,根據(jù)值找到數(shù)據(jù)集所對(duì)應(yīng)的值,也就是住宅的價(jià)格(price),形成散點(diǎn)圖如圖4所示。
圖4 住宅平均房間數(shù)(x 值)與住宅所售價(jià)格(y 值)散點(diǎn)圖
設(shè)計(jì)意圖:數(shù)據(jù)集中有13 個(gè)特征,可引導(dǎo)學(xué)生從一個(gè)特征(住宅平均房間數(shù)rooms)入手,找出住宅平均房間數(shù)與房?jī)r(jià)的關(guān)系,即從特殊到一般的科學(xué)探究方法。
(2)觀察這個(gè)散點(diǎn)圖,會(huì)發(fā)現(xiàn)一些規(guī)律,大概率是住宅平均房間數(shù)越多,住宅的價(jià)格越高,此趨勢(shì)可用一次線性函數(shù)=·+(輸入特征為住宅平均房間數(shù),輸出標(biāo)記為住宅所售價(jià)格,是與軸的截距)擬合,如圖5所示。
圖5 一次線性函數(shù)
設(shè)計(jì)意圖:這就是最簡(jiǎn)單的線性回歸模型。我們要做的就是利用已有數(shù)據(jù),去學(xué)習(xí)得出這條直線,擬合出這條直線,則對(duì)于橫坐標(biāo)(rooms)的任意取值,我們都可以找到直線上對(duì)應(yīng)的值,也就是模型的預(yù)測(cè)值(price),當(dāng)然從圖5中能看出存在一定的誤差,這就需要學(xué)有余力的同學(xué)去深度思考,如何減小誤差。
2.3.1 步驟一:導(dǎo)入相關(guān)的工具包
# 使用 sklearn 內(nèi)置的房?jī)r(jià)數(shù)據(jù)集,load_boston 是加載數(shù)據(jù)集的函數(shù)
from sklearn.datasets import load_boston
# 使用sklearn 中的 train_test_split 劃分?jǐn)?shù)據(jù)集
from sklearn.model_selection import train_test_split
# 使用 sklearn 中的直線回歸模型進(jìn)行預(yù)測(cè)
from sklearn.linear_model import LinearRegression
# 使用 matplotlib 模塊中的 pyplot 函數(shù)進(jìn)行數(shù)據(jù)可視化
import matplotlib.pyplot as plt
設(shè)計(jì)意圖:基于上述設(shè)計(jì)算法和線性回歸的原理,對(duì)照講解sklearn 數(shù)據(jù)集train_test_split 函數(shù)、LinearRegression 直線回歸、matplotlib 模塊的作用。sklearn 是內(nèi)置于Pycharm編程環(huán)境中的數(shù)據(jù)集,只需加載數(shù)據(jù)集即可。
典型問(wèn)題:如何劃分“測(cè)試集”和“訓(xùn)練集”?
解決方法:在機(jī)器學(xué)習(xí)中,我們通常將原始數(shù)據(jù)按照比例分割為“測(cè)試集”和“訓(xùn)練集”,train_test_split 函數(shù)就是起到劃分“測(cè)試集”和“訓(xùn)練集”的作用。
2.3.2 步驟二:加載數(shù)據(jù)集
# 加載房?jī)r(jià)數(shù)據(jù)集,返回特征X 和標(biāo)簽y
X, y = load_boston(return_X_y=True)
# 只取第6 列特征RM:住宅平均房間數(shù)
X = X[:,5:6]
# 劃分為訓(xùn)練集和測(cè)試集,測(cè)試集取20%
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2, random_state=2020)
設(shè)計(jì)意圖:采用從特殊到一般的科學(xué)探究方法,從13個(gè)特征中,只取RM 住宅平均房間數(shù)這一個(gè)特征,找出其與住宅價(jià)格的關(guān)系,測(cè)試集取20%時(shí),觀察程序運(yùn)行后的可視化結(jié)果。
典型問(wèn)題:每次運(yùn)行得到不同的結(jié)果,主要是分割的“測(cè)試集”和“訓(xùn)練集”并不相同問(wèn)題。
解決方法:同樣的算法模型在不同的“測(cè)試集”和“訓(xùn)練集”上運(yùn)行的效果并不一樣。如果每次sklearn 分割的“測(cè)試集”和“訓(xùn)練集”都不相同,那么程序每運(yùn)行一次,都會(huì)得到不同的結(jié)果,導(dǎo)致無(wú)法調(diào)參。此時(shí)加上random_state 以后就可以保證程序每次運(yùn)行都分割一樣的“測(cè)試集”和“訓(xùn)練集”,便于調(diào)參。
2.3.3 步驟三:模型訓(xùn)練和預(yù)測(cè)
# 創(chuàng)建線性回歸對(duì)象
regre = LinearRegression()
# 使用訓(xùn)練集訓(xùn)練模型
regre.fit(X_train, y_train)
# 在測(cè)試集上進(jìn)行預(yù)測(cè)
y_pred = regre.predict(X_test)
設(shè)計(jì)意圖:在理解應(yīng)用線性回歸能預(yù)測(cè)住宅房?jī)r(jià)原理的基礎(chǔ)上,在程序中可直接調(diào)用LinearRegression 直線回歸。
2.3.4 步驟四:預(yù)測(cè)結(jié)果可視化
plt.scatter(X_test, y_test, color=’blue’)
# 畫(huà)線性回歸模型對(duì)測(cè)試數(shù)據(jù)的擬合曲線
plt.plot(X_test, y_pred, color=’red’)
# 顯示繪圖結(jié)果
plt.show()
# 打印斜率和截距
print(‘斜率k:{}, 截距b:{}’.format(regre.coef_,regre.intercept_))
設(shè)計(jì)意圖:引導(dǎo)學(xué)生觀察當(dāng)測(cè)試集取20%,輸入房間數(shù)量為8 時(shí),=·+函數(shù)圖像,其中斜率:[9.111 633 98],截距:-34.475 577 892 806 62,效果如圖6所示。
圖6 測(cè)試集取20%時(shí)y=k·x+b 函數(shù)圖像
設(shè)計(jì)意圖:引導(dǎo)學(xué)生觀察當(dāng)測(cè)試集取80%,輸入房間數(shù)量為8 時(shí),=·+函數(shù)圖像,其中斜率:[12.144 071 32],截距b:-53.322 051 223 109 96,效果如圖7所示。
圖7 測(cè)試集取80%時(shí)y=k·x+b 函數(shù)圖像
典型問(wèn)題:測(cè)試集的取量,會(huì)影響=·+函數(shù)圖像的斜率和截距。
解決方法:其他參數(shù)保持不變,只更改測(cè)試集取量,觀察會(huì)出現(xiàn)何種效果,學(xué)生提出測(cè)試集取量對(duì)=·+函數(shù)圖像的影響。
# 打印斜率和截距
print(‘斜率k:{}, 截距b:{}’.format(regre.coef_,regre.intercept_))
x=int(input(‘請(qǐng)輸入住宅平均房間數(shù): ’))
y=regr.coef_*x+regre.intercept_
print(‘預(yù)測(cè)的住宅價(jià)格是:%s’%y)
# 顯示繪圖結(jié)果
plt.show()
設(shè)計(jì)意圖:matplotlib 是Python 的繪圖庫(kù),掌握應(yīng)用其畫(huà)出圖形,實(shí)現(xiàn)數(shù)據(jù)可視化的方法。
拓展延伸1:當(dāng)測(cè)試集取量20%,輸入住宅平均房間數(shù)為8 時(shí),運(yùn)行程序后顯示:預(yù)測(cè)的住宅價(jià)格是:[38.417 493 97],當(dāng)測(cè)試集取量80%,輸入住宅平均房間數(shù)為8 時(shí),運(yùn)行程序后顯示:預(yù)測(cè)的住宅價(jià)格是:[43.830 519 36],為何會(huì)出現(xiàn)不一樣的預(yù)測(cè)結(jié)果?
拓展延伸2:只有住宅平均房間數(shù)這一個(gè)特征與住宅價(jià)格的關(guān)系,那13 個(gè)特征與住宅價(jià)格的關(guān)系會(huì)有什么預(yù)測(cè)結(jié)果呢?
設(shè)計(jì)意圖:測(cè)試集的取量、住宅平均房間數(shù)都會(huì)對(duì)住宅價(jià)格產(chǎn)生影響,考慮到存在一定的誤差,為進(jìn)一步學(xué)習(xí)均方誤差(MSE),均方根誤差(RMSE),平均絕對(duì)誤差(MAE)的方法來(lái)減小誤差做鋪墊。同時(shí)提出從13 個(gè)特征中只取住宅平均房間數(shù)這一個(gè)特征和住宅價(jià)格的關(guān)系,這是從一般到特殊的科學(xué)探究方法,我們從一個(gè)特征與住宅價(jià)格的關(guān)系中找到規(guī)律,把它應(yīng)用到13 個(gè)特征與住宅價(jià)格的關(guān)系的研究中,這就是再?gòu)奶厥獾揭话愕奶骄窟^(guò)程。程序完整代碼如圖8所示。
圖8 利用線性回歸預(yù)測(cè)某城市房?jī)r(jià)項(xiàng)目完整代碼
問(wèn)題1: 出現(xiàn)提示ModuleNotFoundError: No module named ‘sklearn’錯(cuò)誤或者出現(xiàn)提示ModuleNotFoundError:No module named ‘matplotlib’錯(cuò)誤
解決方法:出現(xiàn)此問(wèn)題的原因是沒(méi)有加載’sklearn’和’matplotlib’庫(kù)所導(dǎo)致的,以Pycharm 2020.3.3 版本為例,介紹Pycharm 軟件加載庫(kù)或模塊的方法:點(diǎn)擊左上角的File 后,選擇Settings 進(jìn)入到設(shè)置頁(yè)面,如圖9所示。
圖9 Pycharm 設(shè)置頁(yè)面
選擇Project 下的Python Interpreter,此時(shí)右側(cè)能看到已安裝的庫(kù)或模塊,如圖10 所示。
圖10 顯示已安裝庫(kù)或模塊
在已安裝庫(kù)或模塊下方點(diǎn)擊“+”號(hào),出現(xiàn)Available Packages頁(yè)面,輸入庫(kù)或模塊名稱后,點(diǎn)擊下方的Install Package,進(jìn)行庫(kù)或模塊的安裝,如圖11 所示。
圖11 搜索庫(kù)或模塊頁(yè)面
問(wèn)題2:Available Packages頁(yè)面顯示Nothing to show 或搜索sklearn 庫(kù)時(shí)不能出現(xiàn)sklearn 庫(kù)。
解決方法:點(diǎn)擊Manage Repositories,默認(rèn)有https://pypi.python.org/simple 鏡像源,可增加一些國(guó)內(nèi)的鏡像源,如清華:https://pypi.tuna.tsinghua.edu.cn/simple、阿里云:https://mirrors.aliyun.com/pypi/simple/、 豆 瓣:https://pypi.douban.com/simple/等鏡像源,如圖12 所示。
圖12 添加國(guó)內(nèi)鏡像源
此時(shí)再搜索sklearn 庫(kù)時(shí),因作者添加了4 個(gè)鏡像源,則可能會(huì)出現(xiàn)4 個(gè)sklearn 庫(kù),選擇其中一個(gè)安裝即可,如圖13 所示。
圖13 多個(gè)源會(huì)出現(xiàn)多個(gè)sklearn 庫(kù)
本文分析的線性回歸模型是建立在一次函數(shù)=·+基礎(chǔ)上,一次函數(shù)是初中數(shù)學(xué)的學(xué)習(xí)內(nèi)容,應(yīng)用數(shù)學(xué)知識(shí)與編程算法相結(jié)合去探究線性回歸經(jīng)典模型,既可以降低程序理解的難度,又可將教學(xué)重心放在線性回歸經(jīng)典模型的教學(xué)上,同時(shí)為學(xué)生提供使用不同學(xué)習(xí)方式再次深入理解一次函數(shù)的機(jī)會(huì)。學(xué)習(xí)線性回歸經(jīng)典模型有助于學(xué)生理解什么是機(jī)器學(xué)習(xí),更重要的是走出與智能音箱、智能機(jī)器人等智能設(shè)備對(duì)話就理解為人工智能的全部這種誤區(qū)。
教師圍繞計(jì)算機(jī)解決問(wèn)題的一般過(guò)程:分析問(wèn)題、設(shè)計(jì)算法、編寫(xiě)程序、調(diào)試運(yùn)行這種逐層遞進(jìn)方式開(kāi)展教學(xué),結(jié)合線性回歸經(jīng)典模型的邏輯步驟,即“導(dǎo)入相關(guān)的工具包、加載數(shù)據(jù)集、模型訓(xùn)練和預(yù)測(cè)、預(yù)測(cè)結(jié)果可視化”四個(gè)步驟,教學(xué)設(shè)計(jì)符合皮亞杰的認(rèn)知發(fā)展理論和維果茨基的最近發(fā)展區(qū)理論,適應(yīng)學(xué)生的認(rèn)知發(fā)展水平、學(xué)生的學(xué)習(xí)是主動(dòng)建構(gòu)知識(shí)的過(guò)程,提升了學(xué)生計(jì)算思維等高階能力的培養(yǎng)。本次人工智能編程教學(xué)實(shí)踐仍處于初步嘗試階段,有部分內(nèi)容需要在后續(xù)教學(xué)實(shí)踐中不斷探索、完善。