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