成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

從零開始學機器學習——線性和多項式回歸

人工智能 機器學習
在探討線性回歸和多項式回歸的旅程中,我們不僅學習了如何構建模型,還理解了背后的數學原理和應用場景。通過逐步引導,希望大家對數據分析的復雜性有了更深的認識。

在之前的學習中,我們已經對數據的準備工作以及數據可視化有了一定的了解。今天,我們將深入探討基本線性回歸和多項式回歸的概念與應用。

如果在過程中涉及到一些數學知識,大家也不必感到畏懼,我會逐步為大家進行詳細的講解,以便大家能夠更好地理解這些內容。希望通過今天的學習,能夠幫助大家建立起對這兩種回歸方法的清晰認識,并掌握它們在實際問題中的應用。

線性和多項式回歸

通常情況下,回歸分析主要分為兩種類型:線性回歸和多項式回歸。線性回歸旨在通過一條直線來描述變量之間的關系,而多項式回歸則允許我們使用多項式函數來更靈活地捕捉數據的復雜趨勢。為了幫助大家直觀地理解這兩種回歸方法,我們可以通過圖片進行展示。

圖片圖片

其實,線性回歸和多項式回歸之間的區別,可以簡單地歸結為直線與曲線的差異。

基本線性回歸

線性回歸練習的目標在于能夠繪制出一條理想的回歸線,那么什么才算是“完美的線”呢?簡而言之,完美的線是指使所有分散的數據點到這條線的距離最短的情況。通常,我們使用最小二乘法來實現這一目標。

理想情況下,這個總和應盡可能小,以確?;貧w線能夠最佳地代表數據的趨勢。接下來,讓我們先看一下相關的數學公式,以便更深入地理解這一過程。

我們希望求出一組未知參數,使得樣本點與擬合線之間的總誤差(即距離)最小化。最直觀的感受如下圖:

圖片圖片

因為相減的結果可能會出現負數的情況,為了確保我們計算出的值始終為正,因此在這里引入了平方的概念。無論減法的結果是正還是負,經過平方處理后,所有的結果都將轉化為正數。

這條綠線被稱為最佳擬合線,可以用一個數學等式來表示:

Y = a + bX

X 是“解釋變量”。Y 是“因變量”。直線的斜率是 b,a 是 y 軸截距,指的是 X = 0 時 Y 的值。

一個好的線性回歸模型將是一個用最小二乘回歸法與直線回歸得到的高(更接近于 1)相關系數的模型。相關系數(也稱為皮爾遜相關系數)我來解釋一下:

圖片圖片

我們可以發現相關系數反映的是變量之間的線性關系和相關性的方向(第一排),而不是相關性的斜率(中間),也不是各種非線性關系(第三排)。請注意:中間的圖中斜率為0,但相關系數是沒有意義的,因為此時變量是0。

工具分析

當然,相關性這種指標的手動計算并不實際,尤其是在面對大規模數據時,手動處理不僅效率低下,還容易出錯。因此,利用現有的框架,如Scikit-learn,能夠更高效、準確地進行相關性分析,讓我們專注于更重要的任務。

?

pip install scikit-learn

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from datetime import datetime
from sklearn.preprocessing import LabelEncoder

pumpkins = pd.read_csv('../data/US-pumpkins.csv')

pumpkins.head()

在獲取樣本數據后,進行分析時,通常需要篩選出我們需要的字段,而那些不需要的則應予以丟棄,以便進一步深入分析。

pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]

columns_to_select = ['Package', 'Variety', 'City Name', 'Low Price', 'High Price', 'Date']
pumpkins = pumpkins.loc[:, columns_to_select]

price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2

month = pd.DatetimeIndex(pumpkins['Date']).month
day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days)

new_pumpkins = pd.DataFrame(
    {'Month': month, 
     'DayOfYear' : day_of_year, 
     'Variety': pumpkins['Variety'], 
     'City': pumpkins['City Name'], 
     'Package': pumpkins['Package'], 
     'Low Price': pumpkins['Low Price'],
     'High Price': pumpkins['High Price'], 
     'Price': price})

new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/1.1
new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price*2
new_pumpkins.iloc[:, 0:-1] = new_pumpkins.iloc[:, 0:-1].apply(LabelEncoder().fit_transform)

new_pumpkins.head()

盡管代碼可能會讓人感到困惑,其核心邏輯其實很簡單:我們只需提取出所需的字段,包括年月、價格、城市和包裝信息。如果你對編程不太熟悉,也完全沒關系,現在有很多代碼助手可供使用,選用任何一個都能輕松寫出所需的代碼。關鍵在于保持清晰的邏輯思路,而不是被代碼的復雜性所干擾。

import matplotlib.pyplot as plt
plt.scatter('City','Price',data=new_pumpkins)

正常來說,城市字段應該是文字也就是城市名字,但是因為計算的原因,這里有一段代碼new_pumpkins.iloc[:, 0:-1] = new_pumpkins.iloc[:, 0:-1].apply(LabelEncoder().fit_transform)將數據集中的分類變量轉換為數值變量,以便于后續的機器學習建模。

圖片圖片

如上所示的效果圖展示了我們的初步分析結果。當然,你可以選擇任何一個字段來進行價格的取點分析,但通過肉眼觀察,往往難以發現變量之間的相關性。不過,這并不成問題,因為現在有很多強大的工具可以幫助我們進行深入的數據分析。

print(new_pumpkins['City'].corr(new_pumpkins['Price']))
# 0.32363971816089226

確實,整個過程簡單明了,一句話就可以概括。接下來,只需將剩余的分析任務交給框架即可。在這里,我們觀察到相關性大約只有0.3,顯示出與1的距離相當明顯,這意味著變量之間的關系并不強。

因此,我們可以嘗試更換另一個字段來對價格進行分析,以進一步探討不同變量之間的相關性。

print(new_pumpkins['Package'].corr(new_pumpkins['Price']))
# 0.6061712937226021

圖片圖片

我們清楚,影響價格的因素有很多,因此每次都單獨嘗試更換字段并運行代碼,以判斷哪個字段與價格的相關性最高,顯得十分繁瑣和低效。在這種情況下,我們可以采用一種更為高效的方法——構造熱力圖。

corr = poly_pumpkins.corr()
corr.style.background_gradient(cmap='coolwarm')

代碼其實非常簡單,僅需兩行就能實現我們的目標。接下來,讓我們一起觀察運行結果,以便更好地理解這些代碼的效果和輸出。

圖片圖片

根據這些相關性系數,你可以直觀地看到 Package 和 Price 之間的良好相關性。

回歸模型

到目前為止,我們可以初步確認,包裝方式的價格與城市地區分布的價格相比,更具相關性。這一發現為我們的分析奠定了基礎,因此接下來,我們將以包裝方式為核心,創建一個回歸模型。

new_columns = ['Package', 'Price']
lin_pumpkins = new_pumpkins.drop([c for c in new_pumpkins.columns if c not in new_columns], axis='columns')
X = lin_pumpkins.values[:, :1]
y = lin_pumpkins.values[:, 1:2]

同樣的,我們只要包裝和價格字段即可。讓后取第一列為X軸數據,第二列為Y軸數據。

接下來,開始構建回歸模型,和第一節差不多,仍然是從樣本總抽取測試集以及訓練集,使用Python的scikit-learn庫來訓練一個線性回歸模型,并對測試集進行預測,代碼再寫一次:

from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
lin_reg = LinearRegression()
lin_reg.fit(X_train,y_train)

pred = lin_reg.predict(X_test)

accuracy_score = lin_reg.score(X_train,y_train)
print('Model Accuracy: ', accuracy_score)
# Model Accuracy:  0.3315342327998987

我來簡單的解釋一下:

  • 將數據集分為訓練集和測試集
  • 創建線性回歸模型并訓練它,是的,就兩行代碼完成了訓練,都不用我們自己寫什么東西。
  • 使用訓練好的模型對測試集進行預測
  • 計算并打印模型的準確度

最終的分數確實不是很高,畢竟相關性也不是很好。

我們可以對已經訓練好的模型進行可視化,以更直觀地展示其性能和預測結果。

plt.scatter(X_test, y_test,  color='black')
plt.plot(X_test, pred, color='blue', linewidth=3)

plt.xlabel('Package')
plt.ylabel('Price')

plt.show()

圖片圖片

這樣,我們基本上就成功實現了一個基礎的線性回歸模型。

多項式回歸

另一種重要的線性回歸類型是多項式回歸。盡管在許多情況下,我們觀察到變量之間存在直接的線性關系——例如,南瓜的體積越大,價格通常也會隨之上漲——但在某些情況下,這種關系可能無法簡單地用平面或直線來表示。

正如我們在上面的圖例中所見,如果我們的模型采用曲線而非直線,這可能更有效地貼合數據點的分布,從而更準確地捕捉變量之間的復雜關系。

new_columns = ['Variety', 'Package', 'City', 'Month', 'Price']
poly_pumpkins = new_pumpkins.drop([c for c in new_pumpkins.columns if c not in new_columns], axis='columns')

我們重新看下數據,然后直接拿出Package和Price值。

X=poly_pumpkins.iloc[:,3:4].values
y=poly_pumpkins.iloc[:,4:5].values

接下來,我們將直接進行模型訓練。在這個過程中,我們使用了另一個API,即scikit-learn庫,來構建一個包含多項式特征轉換和線性回歸模型的管道(pipeline)。這個管道的設計旨在簡化數據處理流程,使得多項式特征的生成和模型的訓練能夠高效地串聯在一起。

from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline

pipeline = make_pipeline(PolynomialFeatures(4), LinearRegression())

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

pipeline.fit(np.array(X_train), y_train)

y_pred=pipeline.predict(X_test)

PolynomialFeatures

在這里,我想簡要介紹一下PolynomialFeatures這一功能。PolynomialFeatures是scikit-learn庫中用于生成多項式特征的工具。

它的主要作用是將輸入的特征轉換為多項式形式,從而允許我們在模型中考慮變量之間的非線性關系。例如,當我們有一個單一特征時,使用PolynomialFeatures可以創建該特征的平方、立方,甚至更高次的特征。

我們的代碼中參數設置為4,意味著我們希望對輸入特征X進行四次多項式轉換。這種轉換將使得每個原始特征生成其四次冪的組合,從而豐富我們的特征集。

為了幫助大家更直觀地理解這一過程,我將提供一組示例數據,展示經過PolynomialFeatures處理后,原有的X特征數據被轉化成了什么樣的多項式特征。

import numpy as np

X = np.array([1, 2, 3, 4, 5])
X = X.reshape(-1, 1)
X

這是我們當前的特征集X,包含了一組簡單的數據點。

array([[1],
       [2],
       [3],
       [4],
       [5]])
pp = PolynomialFeatures(4)
X_poly = pp.fit_transform(X)
print(X_poly)

轉換后會生成如下:

[[  1.   1.   1.   1.   1.]
 [  1.   2.   4.   8.  16.]
 [  1.   3.   9.  27.  81.]
 [  1.   4.  16.  64. 256.]
 [  1.   5.  25. 125. 625.]]

這樣做的意義就在于:線性回歸假設特征與目標之間的關系是線性的。通過多項式特征轉換,可以捕捉更復雜的非線性關系。這有助于提高模型的擬合能力。

在訓練過程中,模型實際上是在學習一個非線性函數,舉個例子例如:二次多項式 表示一個拋物線。

那么這個模型訓練后就會產生如下效果:

df = pd.DataFrame({'x': X_test[:,0], 'y': y_pred[:,0]})
df.sort_values(by='x',inplace = True)
points = pd.DataFrame(df).to_numpy()

plt.plot(points[:, 0], points[:, 1],color="blue", linewidth=3)
plt.xlabel('Package')
plt.ylabel('Price')
plt.scatter(X,y, color="black")
plt.show()

圖片圖片

接下來,我們可以基于這個非線性模型進行預測即可。簡單演示一下:

pipeline.predict( np.array([ [2.75] ]) )
# array([[46.34509342]])

總結

在探討線性回歸和多項式回歸的旅程中,我們不僅學習了如何構建模型,還理解了背后的數學原理和應用場景。通過逐步引導,希望大家對數據分析的復雜性有了更深的認識。未來,在實際問題中靈活應用這些回歸技術,將使我們在數據驅動的決策中占據優勢。

無論是選擇合適的回歸方法,還是運用強大的工具,我們都能夠更有效地從數據中提煉出有價值的見解。接下來,期待大家在實踐中不斷探索、深入挖掘,最終實現對數據的深刻理解與應用。

責任編輯:武曉燕 來源: 靈墨AI探索室
相關推薦

2020-12-22 07:09:01

Python機器學習多項式回歸

2024-12-09 09:44:34

機器學習模型分類器

2015-08-24 14:59:06

Java線程

2022-02-16 22:57:57

Mitmproxy抓包工具

2024-08-01 11:21:52

2020-11-10 08:37:05

Python線性回歸機器學習

2011-04-06 15:55:50

開發webOS程序webOS

2022-09-25 23:34:42

算法回歸算法機器學習

2017-03-14 14:04:24

Python機器學習

2014-07-22 13:09:21

android

2011-09-05 14:17:54

Sencha ToucMVC

2023-03-21 07:35:43

2015-09-18 10:09:05

Swift

2018-08-20 08:15:50

編程語言Go語言切片

2011-05-24 13:37:16

jQueryAjax

2015-08-26 10:01:20

iOS開發

2024-07-30 09:22:44

PostgreSQL數據庫工具

2023-02-20 09:55:00

微服務框架單體架構

2015-11-17 16:11:07

Code Review

2019-01-18 12:39:45

云計算PaaS公有云
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区三区免费 | 精品国产综合 | 欧美日韩高清一区二区三区 | 国产乱码精品一区二区三区五月婷 | 亚洲国产精品成人综合久久久 | 欧美精三区欧美精三区 | 成人午夜在线 | 日本久草| 欧美日韩不卡合集视频 | 欧美中文字幕一区 | 欧美一区二区三区四区视频 | 亚洲一区二区在线电影 | 影视一区 | 欧美色综合 | 免费视频99 | 看片国产 | 日韩精品视频一区二区三区 | 欧美欧美欧美 | 欧美精品 在线观看 | 人人九九精 | 国产精品美女在线观看 | 亚洲精品电影网在线观看 | 天天插天天操 | 午夜专区 | 男女啪啪网址 | 亚洲人成在线观看 | 久久四虎| 国产精品高清一区二区 | av一级在线观看 | 亚洲一区av| 亚洲h在线观看 | 99久久国产精 | 天天操夜夜看 | 精品视频www | 中文日韩在线视频 | 91精品国产91久久综合桃花 | 日韩在线一区二区 | 中文在线一区二区 | 久久久久久蜜桃一区二区 | 久久新 | 日韩成人免费在线视频 |