向量計算器在線計算,愛上Python”——機器學習---多變量的回歸問題

            抖帥宮 637 2023-08-02

            向量計算器在線計算,愛上Python”——機器學習---多變量的回歸問題-第1張-觀點-玄機派

            來源頭條作者:天文學原畫多元回歸與非線性回歸多元回歸:自變量有不止一個,最后來預測一個結果

            非線性回歸:函數就不是簡單的都是一次項,引入了高階項使函數更能完美擬合得到準確率更高的預測值

            首先引入一個學生的身高體重數據集來回顧昨天的一元線性回歸訓練集

            序號

            身高(m)

            體重(kg)

            1

            0.86

            12

            2

            0.96

            15

            3

            1.12

            20

            4

            1.35

            35

            5

            1.55

            48

            6

            1.63

            51

            7

            1.71

            59

            8

            1.78

            66

            測試集

            序號

            身高(m)

            體重(kg)

            1

            0.75

            10

            2

            1.08

            17

            3

            1.26

            27

            4

            1.51

            41

            5

            1.6

            50

            6

            1.67

            64

            7

            1.85

            75

            #先查看身高體重是否存在線性關系 import numpy as np import matplotlib import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties from sklearn.preprocessing import PolynomialFeatures plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False def runplt(): plt.figure() plt.title('身高與體重一元關系') plt.xlabel('身高') plt.ylabel('體重') plt.axis([0,2,0,85]) plt.grid return plt X=[[0.86],[0.96],[1.12],[1.35],[1.55],[1.63],[1.71],[1.78]] y=[[12],[15],[20],[35],[48],[51],[59],[66]] plt=runplt() plt.plot(X,y,'k.') plt.show() 復制代碼

            # 用sklearn的線性模型去擬合 from sklearn.linear_model import LinearRegression model=LinearRegression() model.fit(X,y) #使用身高1.67來進行模型預測 print('預測身高為1.67米的體重為:',model.predict(np.array([1.67]).reshape(-1,1))) 復制代碼預測身高為1.67米的體重為: [[55.75685871]]

            #用測試集對模型整體預測 X_test=[[0.75],[1.08],[1.26],[1.51],[1.6],[1.85]] y_predict=model.predict(X_test) plt.plot(X,y,'k.') plt.plot(X_test,y_predict,'g-') #殘差 yr=model.predict(X) for idx,x in enumerate(X): plt.plot([x,x],[y[idx],yr[idx]],'r-') plt.show() 復制代碼

            #對模型評估 y_test=[[10],[17],[27],[41],[50],[75]] r2=model.score(X_test,y_test) print("模型的確定系數為:",r2) 復制代碼模型的確定系數為: 0.9252812815771203

            進行二元回歸分析使用身高,年齡,體重數據集訓練集

            序號

            身高(cm)

            年齡(歲)

            體重(kg)

            1

            147

            9

            34

            2

            129

            7

            23

            3

            141

            9

            25

            4

            145

            11

            47

            5

            142

            11

            26

            6

            151

            13

            46

            測試集

            序號

            身高(cm)

            年齡(歲)

            體重(kg)

            1

            149

            11

            41

            2

            152

            12

            37

            3

            140

            8

            28

            4

            138

            10

            27

            5

            132

            7

            21

            6

            147

            10

            38

            x_train=[[147,9],[129,7],[141,9],[145,11],[142,11],[151,13]] y_train=[[34],[23],[25],[47],[26],[46]] model2=LinearRegression() model2.fit(x_train,y_train) x_test=[[149,11],[152,12],[140,8],[138,10],[132,7],[147,10]] Y_test=[[41],[37],[28],[27],[21],[38]] predictions=model2.predict(x_test) print("模型2的確定系數為:",model2.score(x_test,Y_test)) for i,prediction in enumerate(predictions): print("預測值:{},真實值為{}".format(prediction,Y_test[i])) 復制代碼

            plt.title('多元回歸實際值與預測值') plt.plot(Y_test,label='y_test') plt.plot(predictions,label='predictions') plt.legend() plt.show() 復制代碼

            對第一個數據集增加二次項實現非線性回歸x1_train=[[0.86],[0.96],[1.12],[1.35],[1.55],[1.63],[1.71],[1.78]] y1_train=[[12],[15],[20],[35],[48],[51],[59],[66]] x1_test=[[0.75],[1.08],[1.26],[1.51],[1.6],[1.85]] y1_test=[[10],[17],[27],[41],[50],[75]] #顯示 plt = runplt() regressor = LinearRegression() regressor.fit(x1_train,y1_train) xx = np.linspace(0,26,100) yy = regressor.predict(xx.reshape(xx.shape[0],1)) plt.plot(x1_train,y1_train,'k.') plt.plot(xx,yy) #構建回歸函數,添加二次項 quadratic_fearurizer = PolynomialFeatures(degree=2) X_train_quadratic = quadratic_fearurizer.fit_transform(x1_train) X_test_quadratic = quadratic_fearurizer.transform(x1_test) regressor_quadratic = LinearRegression() regressor_quadratic.fit(X_train_quadratic,y1_train) xx_quadratic = quadratic_fearurizer.transform(xx.reshape(xx.shape[0],1)) plt.plot(xx,regressor_quadratic.predict(xx_quadratic),'r-') plt.show() print('一元線性回歸r^2:%.2f'%regressor.score(x1_test,y1_test)) print('二元線性回歸r^2:%.2f'%regressor_quadratic.score(X_test_quadratic,y1_test)) 復制代碼

            可以看出引入二次項函數擬合的更好,確定系數也增大了下面我們做個測試,看看引入更高階的項看能不能效果更好

            k_range = range(2,10) k_scores = [] regressor = LinearRegression() regressor.fit(x1_train,y1_train) k_scores.append(regressor.score(x1_test,y1_test)) for k in k_range: k_featurizer = PolynomialFeatures(degree=k) x1_train_k = k_featurizer.fit_transform(x1_train) x1_test_k = k_featurizer.transform(x1_test) regressor_k = LinearRegression() regressor_k.fit(x1_train_k,y1_train) k_scores.append(regressor_k.score(x1_test_k,y1_test)) for i in range(0,8): print('%d項式r^2是%.2f'%(i+1,k_scores[i])) plt.plot([1,2,3,4,5,6,7,8,9],k_scores) plt.show() 復制代碼

            可以看到并不是越高階擬合的越準確,因為有可能在訓練集上擬合的過于好,導致過擬合最后在測試集上就出現了很差的表現

            再來個多元回歸的例子#1.廣告和銷量的多元分析 import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression #導入數據 data=pd.read_csv('./Advertising.csv') #查看數據 data.info() data.head() 復制代碼

            這是一個廣告和產品銷量的數據集,TV,radio,newspaper分別代表電視,收音機,報紙三種廣告消費,sales代表產品銷售量

            # 切分訓練集和測試集 X=data[['TV','radio','newspaper']] y=data['sales'] X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.4,random_state=1)#訓練集測試集6,4分 linreg=LinearRegression() model=linreg.fit(X_train,y_train) print("參數為:",model.intercept_) print("系數為:",model.coef_) 復制代碼

            #預測 y_pred=model.predict(X_test) print("預測值為:",y_pred) 復制代碼

            plt.figure() plt.plot(range(len(y_pred)),y_pred,'r',label='預測值') plt.plot(range(len(y_pred)),y_test,'g',label='測試集真實值') plt.legend(loc="upper right") plt.xlabel('序號') plt.ylabel('產品銷售') plt.show() 復制代碼

            #計算擬合的均方誤差,評估模型 sum_mean=0 for i in range(len(y_pred)): sum_mean+=(y_pred[i]-y_test.values[i])**2 sum_err=np.sqrt(sum_mean/len(y_pred)) print("模型的均方根誤差為",sum_err) 復制代碼模型的均方根誤差為 1.5635772207961516

            總結其實這兩次的回歸問題都是很簡單的入門問題,基本用自己寫的簡單函數就能實現,關鍵是要有從多變量轉到向量計算的思想,以及對梯度下降的理解。在機器學習,特別是深度學習中,最重要的一種思想就是向量化計算的思想,用向量計算代替傳統的循環,可以大大降低計算時間。比如代碼中最后計算均方誤差就可以用向量計算代替循環計算,只要把y_test用numpy變成ndarray形式就可以接著用向量計算。對于這個思想我昨天看到一個大佬寫的博客超贊,大家都可以去看看blog.csdn.net/TeFuirnever…

            我最后用到的數據集下載方式:關注、私信“111”

            作者:shelgi鏈接:https://juejin.cn/post/7029231409545871391

            上一篇:一段緣分,佛說相遇和錯過
            下一篇:nba1995年選秀,美媒盤點森林狼隊史最佳選秀TOP5加內特居首
            相關文章

             發表評論

            暫時沒有評論,來搶沙發吧~

            返回頂部小火箭
            亚洲视频免费一区| 亚洲AV一二三区成人影片| 亚洲第一页在线观看| 亚洲国产精品高清久久久| 久久综合亚洲色HEZYO国产| 亚洲国产成人久久综合区| 亚洲AV成人精品日韩一区| 亚洲精华液一二三产区| 亚洲欧美日韩综合久久久| 亚洲日本国产综合高清| 国产亚洲精aa在线看| 亚洲另类无码专区丝袜| 亚洲AV色无码乱码在线观看| 亚洲AV无码国产精品永久一区| 亚洲AV日韩综合一区| 亚洲第一区精品观看| 亚洲综合精品网站在线观看| 国产亚洲精品影视在线产品| 亚洲精品成人无码中文毛片不卡| 国产亚洲一区二区在线观看| 亚洲国产女人aaa毛片在线 | 久久久久亚洲精品成人网小说| 亚洲av中文无码乱人伦在线咪咕| 亚洲AV无码国产在丝袜线观看| 亚洲好看的理论片电影| 亚洲成在人线中文字幕| 亚洲狠狠成人综合网| 久久人午夜亚洲精品无码区| 亚洲国产精品综合久久网络 | 精品日韩亚洲AV无码| 亚洲国产成人91精品| 日韩亚洲产在线观看| 国产精品亚洲专区无码不卡| 亚洲精品国产高清不卡在线| 亚洲熟妇中文字幕五十中出| 亚洲四虎永久在线播放| 亚洲一区二区三区播放在线| 亚洲AV无码一区二区一二区| 国产精品亚洲玖玖玖在线观看| 亚洲av永久无码精品漫画| 亚洲欧洲中文日产|