DataWhale sklearn学习笔记(一)
線性回歸
數據生成:
生成數據的思路是設定一個二維的函數(維度高了沒辦法在平面上畫出來),根據這個函數生成一些離散的數據點,對每個數據點我們可以適當的加一點波動,也就是噪聲,最后看看我們算法的擬合或者說回歸效果。
import numpy as np import matplotlib.pyplot as plt def true_fun(X): # 這是我們設定的真實函數,即ground truth的模型return 1.5*X + 0.2np.random.seed(0) # 設置隨機種子 n_samples = 30 # 設置采樣數據點的個數'''生成隨機數據作為訓練集,并且加一些噪聲''' X_train = np.sort(np.random.rand(n_samples)).reshape(n_samples, 1) # 原始數據樣本 shape[30, 1] y_train = y_train = (true_fun(X_train) + np.random.randn(n_samples,1) * 0.05) # 增加了一些噪聲,數據標簽shape[30, 1]定義模型
生成數據之后,我們可以定義我們的算法模型,直接從sklearn庫中導入類LinearRegression即可,由于線性回歸比較簡單,所以這個類的輸入參數也比較少,不需要多加設置。 定義好模型之后直接訓練,就能得到我們擬合的一些參數。
from sklearn.linear_model import LinearRegression # 導入線性回歸模型 model = LinearRegression() # 定義模型 model.fit(X_train, y_train) # 訓練模型 print("輸出參數w:",model.coef_) # 輸出模型參數w print("輸出參數b:",model.intercept_) # 輸出參數b輸出結果:
輸出參數w: [[1.4474774]] 輸出參數b: [0.22557542]模型測試與比較
可以看到線性回歸擬合的參數是1.44和0.22,很接近實際的1.5和0.2,說明我們的算法性能還不錯。 下面我們直接選取一批數據測試,然后通過畫圖看看算法模型與實際模型的差距。
由于我們的數據比較簡單,所以從圖中也可以看出,我們的算法擬合曲線與實際的很接近。對于更復雜以及高維的情況,線性回歸不能滿足我們回歸的需求,這時候我們需要用到更為高級一些的多項式回歸了。
多項式回歸
多項式回歸的思路一般是將mmm次多項式方程轉化為 mmm 線性回歸方程,即將 y=b0+b1?x+...+bm?xmy=b_0+b_1?x+...+b_m?x^my=b0?+b1??x+...+bm??xm 轉換為$ y=b0?+b1?x1+...+bm?xmy=b_0?+b_1?x_1+...+b_m?x_my=b0??+b1??x1?+...+bm??xm?(令 xm=xmx_m=x^mxm?=xm 即可),然后使用線性回歸的方法求出相應的參數。 一般實際的算法也是如此,我們將多項式特征分析器和線性回歸串聯,算出線性回歸的參數之后倒推過去就行。
import numpy as np import matplotlib.pyplot as plt from sklearn.pipeline import Pipeline from sklearn.preprocessing import PolynomialFeatures # 導入能夠計算多項式特征的類 from sklearn.linear_model import LinearRegression from sklearn.model_selection import cross_val_scoredef true_fun(X): # 這是我們設定的真實函數,即ground truth的模型return np.cos(1.5 * np.pi * X) np.random.seed(0) n_samples = 30 # 設置隨機種子X = np.sort(np.random.rand(n_samples)) y = true_fun(X) + np.random.randn(n_samples) * 0.1degrees = [1, 4, 15] # 多項式最高次 plt.figure(figsize=(14, 5)) for i in range(len(degrees)):ax = plt.subplot(1, len(degrees), i + 1)plt.setp(ax, xticks=(), yticks=())polynomial_features = PolynomialFeatures(degree=degrees[i],include_bias=False)linear_regression = LinearRegression()pipeline = Pipeline([("polynomial_features", polynomial_features),("linear_regression", linear_regression)]) # 使用pipline串聯模型pipeline.fit(X[:, np.newaxis], y)print(f'degress: {degrees[i]}')print(f'參數1:{linear_regression.coef_}')print(f'參數2:{linear_regression.intercept_}')scores = cross_val_score(pipeline, X[:, np.newaxis], y,scoring="neg_mean_squared_error", cv=10) # 使用交叉驗證X_test = np.linspace(0, 1, 100)plt.plot(X_test, pipeline.predict(X_test[:, np.newaxis]), label="Model")plt.plot(X_test, true_fun(X_test), label="True function")plt.scatter(X, y, edgecolor='b', s=20, label="Samples")plt.xlabel("x")plt.ylabel("y")plt.xlim((0, 1))plt.ylim((-2, 2))plt.legend(loc="best")plt.title("Degree {}\nMSE = {:.2e}(+/- {:.2e})".format(degrees[i], -scores.mean(), scores.std())) plt.show()輸出結果:
可以看出模型的復雜度越高,擬合數據的能力越強。
交叉驗證
如果給定的樣本數據充足,進行模型選擇的一種簡單的方法是隨機地將數據集分為三部分,分別為訓練集、驗證集和測試集,訓練集用來訓練模型,驗證集用于模型的選擇,而測試集用于最終對學習方法的評估。在學習到的不同復雜度的模型中,選擇對驗證集有最小預測誤差的模型。由于驗證集有足夠多的數據,用它對模型進行選擇也是有效的。
但是在許多實際應用中數據是不充足的。為了選擇好的模型,可以采用交叉驗證方法。交叉驗證的基本想法是重復地使用數據:把給定的數據進行切分,將切分的數據集組合為訓練集與測試集,在此基礎上反復地進行訓練、測試以及模型的選擇。
在本算法訓練過程中,我們使用了一個技巧,就是交叉驗證,類似的方法還有holdout檢驗以及自助法(交叉驗證的升級版,即每次又放回去的選取數據)。 交叉驗證法的作用就是嘗試利用不同的訓練集/測試集劃分來對模型做多組不同的訓練/測試,來應對測試結果過于片面以及訓練數據不足的問題。過程如下圖:
在我們訓練完成一個模型后,需要驗證這個模型的好壞,因此使用交叉驗證的方式來評價模型。一般情況下根據超參數會生成多個模型,使用交叉驗證可以對多個模型進行評價,得到多個模型的交叉驗證結果,然后選擇最好的結果作為最終模型。
邏輯回歸
線性回歸一樣,需要求出 n 個參數:z=θ0+θ1x+θ2x+...+θnx=θTxz=\theta_0 + \theta_1 x + \theta_2x+...+\theta_nx=\theta^Txz=θ0?+θ1?x+θ2?x+...+θn?x=θTx
邏輯回歸通過Sigmoid函數引入了非線性因素,可以輕松處理二分類問題:
hθ(x)=g(θTx),g(z)=11+e?zh_\theta(x) = g(\theta^Tx), g(z)= \frac{1}{1+e^{-z}} hθ?(x)=g(θTx),g(z)=1+e?z1?
與線性回歸不同,邏輯回歸使用的是交叉熵損失函數:
其梯度為:
總結
以上是生活随笔為你收集整理的DataWhale sklearn学习笔记(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果为 iPhone 关闭 iOS17.
- 下一篇: 孕四十天晨尿色彩测男女是归于偏方仍是真的