python機器學習經典實例-學習筆記2
來自專欄 python機器學習經典實踐-學習筆記
標記編碼方法
1.在監督學習中,經常需要處理各種各樣的標記。這些標記可能是數字,也可能是單詞。
【補充:sklearn 中的 name.fit(variable)的意思是提取變數variable的特徵,即將相同的數據進行合併。】
label_encoder = preprocessing.LabelEncoder()input_classes = [audi, ford, audi, toyota, ford, bmw]label_encoder.fit(input_classes)#print ("
Class mapping:")print(label_encoder.classes_)for i, item in enumerate(label_encoder.classes_): print (item, -->, i)for i, item in enumerate(input_classes): print (item, -->, i)
第3行:合併變數input_classes中的相同的變數。
第5行:輸出fit後的結果為: [audi bmw ford toyota]
第一個for循環輸出經過fit後的結果:
audi --> 0bmw --> 1ford --> 2toyota --> 3
第二個for循環是未經過fit的結果(完全輸出):
audi --> 0ford --> 1audi --> 2toyota --> 3ford --> 4bmw --> 5
可以看出0和2、1和4的變數是重複的。
2. 就像前面結果顯示的那樣,單詞被轉換成從0開始的索引值。現在,如果你遇到一組標記,
就可以非常輕鬆地轉換它們了
標籤的查詢
labels = [toyota, ford, audi]#查詢索引的標籤encoded_labels = label_encoder.transform(labels)#轉換成總標籤label_encoder對應的位置print ("
Labels =", labels)print ("Encoded labels =", list(encoded_labels))
輸出結果
Labels = [toyota, ford, audi]Encoded labels = [3, 2, 0]
3. 還可以通過數字反轉回單詞的功能檢查結果的正確性
encoded_labels = [2, 1, 0, 3, 1]decoded_labels = label_encoder.inverse_transform(encoded_labels)print ("
Encoded labels =", encoded_labels)print ("Decoded labels =", list(decoded_labels))
輸出結果
Encoded labels = [2, 1, 0, 3, 1]Decoded labels = [ford, bmw, audi, toyota, bmw]
創建線性回歸器
線性回歸的目標是提取輸入變數與輸出變數的關聯線性模型,這就要求實際輸出與線性方程
預測的輸出的殘差平方和(sum of squares of differences)最小化。這種方法被稱為普通最小二乘法(Ordinary Least Squares,OLS)。
接下來看看如何用Python建立線性回歸模型。
代碼資料獲取:
http://weixin.qq.com/r/zERKUijEMXVOrWwx9xHe (二維碼自動識別)
颶風科技官網:機器學習>代碼1
- 取訓練和測試的數據:
把輸入數據載入到變數X和y,其中X是數據,y是標記。在代碼的for循環體中,我們解析每
行數據,用逗號分割欄位。然後,把欄位轉化為浮點數,並分別保存到變數X和y中。
import numpy as npX = []y = []with open(C://Users/imace/Desktop/python_execise/Chapter01/data_singlevar.txt , r) as f: for line in f.readlines(): xt, yt = [float(i) for i in line.split(,)] X.append(xt) y.append(yt)
定義列表X、Y存儲變數
讀取data_singlevar.txt 文件里的數據
補充:.readlines() 自動將文件內容分析成一個行的列表,該列表可以由 Python 的 for … in … 結構進行處理。另一方面,.readline() 每次只讀取一行,通常比 .readlines() 慢得多。僅當沒有足夠內存可以一次讀取整個文件時,才應該使用 .readline(),讀取的文件類型是字元串。
split():拆分字元串。通過指定分隔符對字元串進行切片,並返回分割後的字元串列表(list)
name.append() 方法用於在列表末尾添加新的對象。
- 驗證演算法-訓練數據//測試數據
建立機器學習模型時,需要用一種方法來驗證模型,檢查模型是否達到一定的滿意度
(satisfactory level)。為了實現這個方法,把數據分成兩組:訓練數據集(training dataset)與測試數據集(testing dataset)。訓練數據集用來建立模型,測試數據集用來驗證模型對未知數據的學習效果。因此,先把數據分成訓練數據集與測試數據集:
# Train/test splitnum_training = int(0.8 * len(X))num_test = len(X) - num_training# Training dataX_train = np.array(X[:num_training]).reshape((num_training,1))y_train = np.array(y[:num_training])# Test dataX_test = np.array(X[num_training:]).reshape((num_test,1))y_test = np.array(y[num_training:])
這裡用80%的數據作為訓練數據集,其餘20%的數據作為測試數據集。
X[:num_training]
X既不是行也不是列向量。雖然我們可能知道它應該被解釋為目標值的一維數組,fit()
但是現在還不夠聰明,不知道該如何處理它。因此.reshape((num_training,1))將其定義成成一列(我試了:一行不可以。原因未知)
- 3. 現在已經準備好訓練模型。接下來創建一個回歸器對象
調用線性回歸模塊
# Create linear regression objectfrom sklearn import linear_modellinear_regressor = linear_model.LinearRegression()# Train the model using the training setslinear_regressor.fit(X_train, y_train)
fit()可以說是調用的通用方法。fit(X),表示用數據X來訓練某種模型。 函數返回值一般為調用fit方法的對象本身。fit(X,y=None)為無監督學習演算法,fit(X,Y)為監督學習演算法。
- 4. 我們利用訓練數據集訓練了線性回歸器。向fit方法提供輸入數據即可訓練模型。用下面的代碼看看它如何擬合。
import matplotlib.pyplot as plty_train_pred = linear_regressor.predict(X_train)plt.figure()plt.scatter(X_train, y_train, color=green)plt.plot(X_train, y_train_pred, color=red, linewidth_=2)plt.title(Training data)plt.show()
如圖
- 接下來用模型對測試數據集進行預測,然後畫出來看。
y_test_pred = linear_regressor.predict(X_test)# Plot outputsimport matplotlib.pyplot as pltplt.scatter(X_test, y_test, color=green)plt.plot(X_test, y_test_pred, color=black, linewidth_=2)#plt.xticks(())#plt.yticks(())plt.show()
- 衡量回歸器擬合效果的重要指標
- 平均絕對誤差(mean absolute error):這是給定數據集的所有數據點的絕對誤差平均值。
- 均方誤差(mean squared error):這是給定數據集的所有數據點的誤差的平方的平均值。這是最流行的指標之一。
- 中位數絕對誤差(median absolute error):這是給定數據集的所有數據點的誤差的中位數。這個指標的主要優點是可以消除異常值(outlier)的干擾。測試數據集中的單個壞點不會影響整個誤差指標,均值誤差指標會受到異常點的影響。
- 解釋方差分(explained variance score):這個分數用于衡量我們的模型對數據集波動的解釋能力。如果得分1.0分,那麼表明我們的模型是完美的。
- R方得分(R2 score):這個指標讀作「R方」,是指確定性相關係數,用于衡量模型對未知樣本預測的效果。最好的得分是1.0,值也可以是負數。
# Measure performanceimport sklearn.metrics as smprint ("Mean absolute error =", round(sm.mean_absolute_error(y_test, y_test_pred), 2) )print ("Mean squared error =", round(sm.mean_squared_error(y_test, y_test_pred), 2) )print ("Median absolute error =", round(sm.median_absolute_error(y_test, y_test_pred), 2) )print ("Explain variance score =", round(sm.explained_variance_score(y_test, y_test_pred), 2) )print ("R2 score =", round(sm.r2_score(y_test, y_test_pred), 2))
結果out:
Mean absolute error = 0.54Mean squared error = 0.38Median absolute error = 0.54Explain variance score = 0.68R2 score = 0.68
- 模型的存儲與調用
在機器學習中,我們常常需要把訓練好的模型存儲起來,這樣在進行決策時直接將模型讀出,而不需要重新訓練模型,這樣就大大節約了時間。Python提供的pickle模塊就很好地解決了這個問題,它可以序列化對象並保存到磁碟中,並在需要的時候讀取出來,任何對象都可以執行序列化操作。
Pickle模塊中最常用的函數為:
(1)pickle.dump(obj, file, [,protocol])
函數的功能:將obj對象序列化存入已經打開的file中。
參數講解:
- obj:想要序列化的obj對象。
- file:文件名稱。
- protocol:序列化使用的協議。如果該項省略,則默認為0。如果為負值或HIGHEST_PROTOCOL,則使用最高的協議版本。
# Model persistenceimport pickleoutput_model_file = 3_model_linear_regr.pklwith open(output_model_file, wb) as f: pickle.dump(linear_regressor, f)with open(output_model_file, rb) as f: model_linregr = pickle.load(f)y_test_pred_new = model_linregr.predict(X_test)print ("
New mean absolute error =", round(sm.mean_absolute_error(y_test, y_test_pred_new), 2) )
調用結果out:
New mean absolute error = 0.54
未完待續。。。。。。
下一節--嶺回歸器、多項式回歸器
2018-3-31.。。。。。。。。。。。。。。。。。。。。。。。。
推薦閱讀:
※用 cx_Freeze 將 Python 腳本編譯為 Windows exe 實戰
※python把一個unicode字元串寫入文件為什麼會報錯?
※左手用R右手Python系列之—表格數據抓取之道
※Linux Centos7 升級python2至python3
※python3機器學習經典實例-學習筆記8-分類演算法