付東升
(廈門英才學(xué)校,福建 廈門 361000)
人臉識別、自動駕駛、智能客服、短視頻推薦、金融風(fēng)控、智慧醫(yī)療、智慧農(nóng)業(yè)、機(jī)器人技術(shù)等,這些都是人工智能在各個行業(yè)中的具體應(yīng)用。人工智能涉及的范圍較廣,知識難度較大,根據(jù)目前人工智能叢書中所提出的內(nèi)容,主要以了解人工智能在生活中的應(yīng)用為主,或結(jié)合給定功能的開源硬件,體驗(yàn)人工智能項(xiàng)目的應(yīng)用,往往不能真正理解人工智能中某個項(xiàng)目的原理,代碼編程項(xiàng)目設(shè)計(jì)更是無從下手,因此,本文嘗試以線性回歸項(xiàng)目為基礎(chǔ),開展項(xiàng)目化的人工智能教學(xué),結(jié)合初中生認(rèn)知水平,從原理的講解到代碼的編寫,以期給中學(xué)人工智能教學(xué)以借鑒作用。
機(jī)器學(xué)習(xí)分為監(jiān)督學(xué)習(xí)、無監(jiān)督學(xué)習(xí)和強(qiáng)化學(xué)習(xí),其中監(jiān)督學(xué)習(xí)又包含回歸問題和分類問題,線性回歸是機(jī)器學(xué)習(xí)中的經(jīng)典模型。初一學(xué)生對人工智能已有初步的了解和接觸,學(xué)生已達(dá)到學(xué)習(xí)機(jī)器學(xué)習(xí)基礎(chǔ)知識的認(rèn)知水平,本節(jié)將應(yīng)用Pycharm 編程軟件,通過Python 語言嘗試對“某城市房價問題”這一線性回歸問題做編程嘗試,學(xué)生在實(shí)際代碼的編寫過程中探究線性回歸的基本原理,切身體驗(yàn)分析問題、設(shè)計(jì)算法、編寫程序、調(diào)試運(yùn)行的過程。
教師圍繞計(jì)算機(jī)解決問題的一般過程:分析問題、設(shè)計(jì)算法、編寫程序、調(diào)試運(yùn)行與“導(dǎo)入相關(guān)的工具包、加載數(shù)據(jù)集、模型訓(xùn)練和預(yù)測、預(yù)測結(jié)果可視化”四個步驟進(jìn)行教學(xué)活動,具體教學(xué)過程有以下幾個方面。
2.1.1 提出問題
中國人一般都有家的情節(jié),我們每天住在寬敞的房子中,有沒有想過能住在漂亮的房子里,是因?yàn)楦改感燎诘墓ぷ鳎炕氐絾栴}上,現(xiàn)已知:20 世紀(jì)70年代中期,某城市郊區(qū)住宅的一些數(shù)據(jù)點(diǎn),比如犯罪率、當(dāng)?shù)胤慨a(chǎn)稅率等。
教師提出問題:假設(shè)你是一個房地產(chǎn)商人,根據(jù)給定的一組關(guān)于郊區(qū)住宅的數(shù)據(jù)點(diǎn),如圖1所示,你能夠預(yù)測出其他住宅的售價為多少會更合適嗎

圖1 郊區(qū)住宅數(shù)據(jù)點(diǎn)
設(shè)計(jì)意圖:在情感態(tài)度價值觀上,學(xué)生能更理解父母工作的不易,只有付出才有回報,同時基于問題的教學(xué)法開篇,拋出回歸問題案例,激發(fā)學(xué)生興趣。
2.1.2 認(rèn)識數(shù)據(jù)集中存有哪些數(shù)據(jù)
(1)load_boston 數(shù)據(jù)集是以字典(Dictionary)的方式存儲數(shù)據(jù),使用以下三行代碼,可輸出load_boston 數(shù)據(jù)集中所含有的“鍵”,輸出結(jié)果如圖2所示。

圖2 load_boston 數(shù)據(jù)集中所含有的“鍵”
代碼:

設(shè)計(jì)意圖:引導(dǎo)學(xué)生深度挖掘某城市房價數(shù)據(jù),掌握其采用字典存儲方式的意義,即便于通過“鍵”查找其“值”,從而理解數(shù)據(jù)集中存儲的每一個“鍵”的含義。
數(shù)據(jù)集含有數(shù)據(jù)(506 個樣本,14 個屬性):主要為:數(shù)據(jù)(‘data’),目標(biāo)價格(‘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é)生理解字典存儲數(shù)據(jù)意義的基礎(chǔ)上,輸出完整數(shù)據(jù),清楚認(rèn)識“鍵”和其所對應(yīng)的“值”,只有深度了解數(shù)據(jù)集中的數(shù)據(jù),才能便于調(diào)用數(shù)據(jù)。
(1)我們提取住宅平均房間數(shù)這一個特征(rooms)作為橫坐標(biāo)值,根據(jù)值找到數(shù)據(jù)集所對應(yīng)的值,也就是住宅的價格(price),形成散點(diǎn)圖如圖4所示。

圖4 住宅平均房間數(shù)(x 值)與住宅所售價格(y 值)散點(diǎn)圖
設(shè)計(jì)意圖:數(shù)據(jù)集中有13 個特征,可引導(dǎo)學(xué)生從一個特征(住宅平均房間數(shù)rooms)入手,找出住宅平均房間數(shù)與房價的關(guān)系,即從特殊到一般的科學(xué)探究方法。
(2)觀察這個散點(diǎn)圖,會發(fā)現(xiàn)一些規(guī)律,大概率是住宅平均房間數(shù)越多,住宅的價格越高,此趨勢可用一次線性函數(shù)=·+(輸入特征為住宅平均房間數(shù),輸出標(biāo)記為住宅所售價格,是與軸的截距)擬合,如圖5所示。

圖5 一次線性函數(shù)
設(shè)計(jì)意圖:這就是最簡單的線性回歸模型。我們要做的就是利用已有數(shù)據(jù),去學(xué)習(xí)得出這條直線,擬合出這條直線,則對于橫坐標(biāo)(rooms)的任意取值,我們都可以找到直線上對應(yīng)的值,也就是模型的預(yù)測值(price),當(dāng)然從圖5中能看出存在一定的誤差,這就需要學(xué)有余力的同學(xué)去深度思考,如何減小誤差。
2.3.1 步驟一:導(dǎo)入相關(guān)的工具包
# 使用 sklearn 內(nèi)置的房價數(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ù)測
from sklearn.linear_model import LinearRegression
# 使用 matplotlib 模塊中的 pyplot 函數(shù)進(jìn)行數(shù)據(jù)可視化
import matplotlib.pyplot as plt
設(shè)計(jì)意圖:基于上述設(shè)計(jì)算法和線性回歸的原理,對照講解sklearn 數(shù)據(jù)集train_test_split 函數(shù)、LinearRegression 直線回歸、matplotlib 模塊的作用。sklearn 是內(nèi)置于Pycharm編程環(huán)境中的數(shù)據(jù)集,只需加載數(shù)據(jù)集即可。
典型問題:如何劃分“測試集”和“訓(xùn)練集”?
解決方法:在機(jī)器學(xué)習(xí)中,我們通常將原始數(shù)據(jù)按照比例分割為“測試集”和“訓(xùn)練集”,train_test_split 函數(shù)就是起到劃分“測試集”和“訓(xùn)練集”的作用。
2.3.2 步驟二:加載數(shù)據(jù)集
# 加載房價數(shù)據(jù)集,返回特征X 和標(biāo)簽y
X, y = load_boston(return_X_y=True)
# 只取第6 列特征RM:住宅平均房間數(shù)
X = X[:,5:6]
# 劃分為訓(xùn)練集和測試集,測試集取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個特征中,只取RM 住宅平均房間數(shù)這一個特征,找出其與住宅價格的關(guān)系,測試集取20%時,觀察程序運(yùn)行后的可視化結(jié)果。
典型問題:每次運(yùn)行得到不同的結(jié)果,主要是分割的“測試集”和“訓(xùn)練集”并不相同問題。
解決方法:同樣的算法模型在不同的“測試集”和“訓(xùn)練集”上運(yùn)行的效果并不一樣。如果每次sklearn 分割的“測試集”和“訓(xùn)練集”都不相同,那么程序每運(yùn)行一次,都會得到不同的結(jié)果,導(dǎo)致無法調(diào)參。此時加上random_state 以后就可以保證程序每次運(yùn)行都分割一樣的“測試集”和“訓(xùn)練集”,便于調(diào)參。
2.3.3 步驟三:模型訓(xùn)練和預(yù)測
# 創(chuàng)建線性回歸對象
regre = LinearRegression()
# 使用訓(xùn)練集訓(xùn)練模型
regre.fit(X_train, y_train)
# 在測試集上進(jìn)行預(yù)測
y_pred = regre.predict(X_test)
設(shè)計(jì)意圖:在理解應(yīng)用線性回歸能預(yù)測住宅房價原理的基礎(chǔ)上,在程序中可直接調(diào)用LinearRegression 直線回歸。
2.3.4 步驟四:預(yù)測結(jié)果可視化
plt.scatter(X_test, y_test, color=’blue’)
# 畫線性回歸模型對測試數(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)測試集取20%,輸入房間數(shù)量為8 時,=·+函數(shù)圖像,其中斜率:[9.111 633 98],截距:-34.475 577 892 806 62,效果如圖6所示。

圖6 測試集取20%時y=k·x+b 函數(shù)圖像
設(shè)計(jì)意圖:引導(dǎo)學(xué)生觀察當(dāng)測試集取80%,輸入房間數(shù)量為8 時,=·+函數(shù)圖像,其中斜率:[12.144 071 32],截距b:-53.322 051 223 109 96,效果如圖7所示。

圖7 測試集取80%時y=k·x+b 函數(shù)圖像
典型問題:測試集的取量,會影響=·+函數(shù)圖像的斜率和截距。
解決方法:其他參數(shù)保持不變,只更改測試集取量,觀察會出現(xiàn)何種效果,學(xué)生提出測試集取量對=·+函數(shù)圖像的影響。
# 打印斜率和截距
print(‘斜率k:{}, 截距b:{}’.format(regre.coef_,regre.intercept_))
x=int(input(‘請輸入住宅平均房間數(shù): ’))
y=regr.coef_*x+regre.intercept_
print(‘預(yù)測的住宅價格是:%s’%y)
# 顯示繪圖結(jié)果
plt.show()
設(shè)計(jì)意圖:matplotlib 是Python 的繪圖庫,掌握應(yīng)用其畫出圖形,實(shí)現(xiàn)數(shù)據(jù)可視化的方法。
拓展延伸1:當(dāng)測試集取量20%,輸入住宅平均房間數(shù)為8 時,運(yùn)行程序后顯示:預(yù)測的住宅價格是:[38.417 493 97],當(dāng)測試集取量80%,輸入住宅平均房間數(shù)為8 時,運(yùn)行程序后顯示:預(yù)測的住宅價格是:[43.830 519 36],為何會出現(xiàn)不一樣的預(yù)測結(jié)果?
拓展延伸2:只有住宅平均房間數(shù)這一個特征與住宅價格的關(guān)系,那13 個特征與住宅價格的關(guān)系會有什么預(yù)測結(jié)果呢?
設(shè)計(jì)意圖:測試集的取量、住宅平均房間數(shù)都會對住宅價格產(chǎn)生影響,考慮到存在一定的誤差,為進(jìn)一步學(xué)習(xí)均方誤差(MSE),均方根誤差(RMSE),平均絕對誤差(MAE)的方法來減小誤差做鋪墊。同時提出從13 個特征中只取住宅平均房間數(shù)這一個特征和住宅價格的關(guān)系,這是從一般到特殊的科學(xué)探究方法,我們從一個特征與住宅價格的關(guān)系中找到規(guī)律,把它應(yīng)用到13 個特征與住宅價格的關(guān)系的研究中,這就是再從特殊到一般的探究過程。程序完整代碼如圖8所示。

圖8 利用線性回歸預(yù)測某城市房價項(xiàng)目完整代碼
問題1: 出現(xiàn)提示ModuleNotFoundError: No module named ‘sklearn’錯誤或者出現(xiàn)提示ModuleNotFoundError:No module named ‘matplotlib’錯誤
解決方法:出現(xiàn)此問題的原因是沒有加載’sklearn’和’matplotlib’庫所導(dǎo)致的,以Pycharm 2020.3.3 版本為例,介紹Pycharm 軟件加載庫或模塊的方法:點(diǎn)擊左上角的File 后,選擇Settings 進(jìn)入到設(shè)置頁面,如圖9所示。

圖9 Pycharm 設(shè)置頁面
選擇Project 下的Python Interpreter,此時右側(cè)能看到已安裝的庫或模塊,如圖10 所示。

圖10 顯示已安裝庫或模塊
在已安裝庫或模塊下方點(diǎn)擊“+”號,出現(xiàn)Available Packages頁面,輸入庫或模塊名稱后,點(diǎn)擊下方的Install Package,進(jìn)行庫或模塊的安裝,如圖11 所示。

圖11 搜索庫或模塊頁面
問題2:Available Packages頁面顯示Nothing to show 或搜索sklearn 庫時不能出現(xiàn)sklearn 庫。
解決方法:點(diǎn)擊Manage Repositories,默認(rèn)有https://pypi.python.org/simple 鏡像源,可增加一些國內(nèi)的鏡像源,如清華:https://pypi.tuna.tsinghua.edu.cn/simple、阿里云:https://mirrors.aliyun.com/pypi/simple/、 豆 瓣:https://pypi.douban.com/simple/等鏡像源,如圖12 所示。

圖12 添加國內(nèi)鏡像源
此時再搜索sklearn 庫時,因作者添加了4 個鏡像源,則可能會出現(xiàn)4 個sklearn 庫,選擇其中一個安裝即可,如圖13 所示。

圖13 多個源會出現(xiàn)多個sklearn 庫
本文分析的線性回歸模型是建立在一次函數(shù)=·+基礎(chǔ)上,一次函數(shù)是初中數(shù)學(xué)的學(xué)習(xí)內(nèi)容,應(yīng)用數(shù)學(xué)知識與編程算法相結(jié)合去探究線性回歸經(jīng)典模型,既可以降低程序理解的難度,又可將教學(xué)重心放在線性回歸經(jīng)典模型的教學(xué)上,同時為學(xué)生提供使用不同學(xué)習(xí)方式再次深入理解一次函數(shù)的機(jī)會。學(xué)習(xí)線性回歸經(jīng)典模型有助于學(xué)生理解什么是機(jī)器學(xué)習(xí),更重要的是走出與智能音箱、智能機(jī)器人等智能設(shè)備對話就理解為人工智能的全部這種誤區(qū)。
教師圍繞計(jì)算機(jī)解決問題的一般過程:分析問題、設(shè)計(jì)算法、編寫程序、調(diào)試運(yùn)行這種逐層遞進(jìn)方式開展教學(xué),結(jié)合線性回歸經(jīng)典模型的邏輯步驟,即“導(dǎo)入相關(guān)的工具包、加載數(shù)據(jù)集、模型訓(xùn)練和預(yù)測、預(yù)測結(jié)果可視化”四個步驟,教學(xué)設(shè)計(jì)符合皮亞杰的認(rèn)知發(fā)展理論和維果茨基的最近發(fā)展區(qū)理論,適應(yīng)學(xué)生的認(rèn)知發(fā)展水平、學(xué)生的學(xué)習(xí)是主動建構(gòu)知識的過程,提升了學(xué)生計(jì)算思維等高階能力的培養(yǎng)。本次人工智能編程教學(xué)實(shí)踐仍處于初步嘗試階段,有部分內(nèi)容需要在后續(xù)教學(xué)實(shí)踐中不斷探索、完善。