監督學習筆記

来源:http://www.cnblogs.com/NSGUF/archive/2017/12/23/8094290.html
-Advertisement-
Play Games

監督學習 概念: 在有標記的樣本(labels samples)上建立機器學習 1、數據的預處理 機器學習演算法無法理解原始數據,所以需對原始數據進行預處理,常用預處理如下: 預處理主要使用了preprocessing包,所以需對該包進行導入: import numpy as np from skle ...


監督學習

概念:在有標記的樣本(labels samples)上建立機器學習

1、數據的預處理

機器學習演算法無法理解原始數據,所以需對原始數據進行預處理,常用預處理如下:
預處理主要使用了preprocessing包,所以需對該包進行導入:

import numpy as np
from sklearn import preprocessing
data=np.array([
        [3,-1.5,2,-5.4],
        [0,4,-0.3,2.1],
        [1,3.3,-1.9,-4.3]
        ])

1.1均值移除(Mean removal)

#將特征數據的分佈調整成標準正太分佈,也叫高斯分佈,
#也就是使得數據的均值維0,方差為1.標準化是針對每一列而言的
#方法一
data_standardized=preprocessing.scale(data)
print('Mean=',data_standardized.mean(axis=0))#特征均值幾乎為0
print('Std=',data_standardized.std(axis=0))#標準差為1
#方法二
scaler=preprocessing.StandardScaler().fit(data)
print('Mean=',scaler.transform(data).mean(axis=0))#特征均值幾乎為0
print('Std=',scaler.transform(data).std(axis=0))#標準差為1

1.2範圍縮放(Scaling)

#為了對付那些標準差相當小的特征並且保留下稀疏數據中的0值
#方法一:計算公式如下:
#X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
#X_scaled = X_std / (max - min) + min
data_minmax_scaler = preprocessing.MinMaxScaler(feature_range=(0, 1))
data_scaled = data_minmax_scaler.fit_transform(data)
print("Min max scaled data:", data_scaled)
#方法二:特征中絕對值最大的那個數為1,其他數以此維標準分佈在[[-1,1]之間
max_abs_scaler = preprocessing.MaxAbsScaler()
x_train_maxsbs = max_abs_scaler.fit_transform(data)
print("Max abs scaled data:", x_train_maxsbs)

1.3歸一化(Normalization)

# 正則化:保證每個特征向量的值都縮放到相同的數值範圍內,
#提高不同特征特征數據的可比性,如數據有許多異常值可使用此方法
#方法一:第二個參數可謂l1與l2,最常用為調整到l1範數,使所有特征向量之和為1
data_normalized = preprocessing.normalize(data, norm='l1')
print("\nL1 normalized data:\n", data_normalized)
#方法二:
normalizer = preprocessing.Normalizer(copy=True, norm='l2').fit(data)#創建正則器
normalizer.transform(data)

1.4二值化(Binarization)

# 將數值型的特征數據轉換成布爾類型的值
# 方法一
data_binarized = preprocessing.Binarizer(threshold=1.4).transform(data)#比1.4大的為1,小的為0
print("\nBinarized data:\n", data_binarized)
#方法二:
binarizer = preprocessing.Binarizer(threshold=0)
print("\nBinarized data:\n", binarizer.transform(data)) 

1.5獨熱編碼(One-Hot Encoding)

# http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html
encoder = preprocessing.OneHotEncoder()
encoder.fit([[0, 2, 1, 12], [1, 3, 5, 3], [2, 3, 2, 12], [1, 2, 4, 3]])
encoded_vector = encoder.transform([[2, 3, 5, 3]]).toarray()
print("Encoded vector:", encoded_vector)
print("_values_:", encoder.n_values_)#值的每個特征的最大數量。
print("Encoded vector:", encoder.feature_indices_)

1.6彌補缺失值

imp = preprocessing.Imputer(missing_values='NaN', axis=0)#NaN可換成其他
imp.fit([[1, 2], [np.nan, 3], [7, 6]])
x = [[np.nan, 2], [6, np.nan], [7, 6]]
print(imp.transform(x))#填入(1+7)/2和(2+3+6)/3

1.7.生成多項式的特征

# 生成多項式的特征,得到高階相互作用特征
poly = preprocessing.PolynomialFeatures(2)# 創建2次方的多項式
print(poly.fit_transform(data))

1.8.定製變壓器

#定製變壓器:輔助數據清洗或處理
transformer = preprocessing.FunctionTransformer(np.log1p)
print(transformer.transform(np.array([[0, 1], [2, 3]])))

參考文獻:http://blog.csdn.net/sinat_33761963/article/details/53433799

     http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html

     http://scikit-learn.org/stable/modules/preprocessing.html#preprocessing

     Python機器學習經典實例

2、標記編碼

概念:把單詞標記轉換成數值形式,讓演算法懂得如何操作標記。

# 1、定義一個標記編碼器(label encoder)
label_encoder=preprocessing.LabelEncoder()
# 2、給出標記
input_classes=['abc','egf','opq','rst','bcd','cde']
# 3、為標記編碼,按第一個字母順序為標記排編號,從0開始
label_encoder.fit(input_classes)
for i,item in enumerate(label_encoder.classes_):
    print(item,'->',i)
# 4、轉換標記,將給出的標記變為排序標號
label=['rst','opq','abc','rst','opq','abc']
encoded_labels=label_encoder.transform(label)
print(label,encoded_labels)
# 5、反轉標記,將給出的數字,對應出標記
encoded_label=[4,3,2,4,1]
labels=label_encoder.inverse_transform(encoded_label)
print(encoded_label,labels)

3、線性回歸器

import numpy as np
# 創建線性回歸器 目的:提取輸入變數與輸出變數的關聯線性模型,可以使得實際輸出與線性方程預
# 測的輸出的差平方和(sum of squares of differences)最小化,該方法稱普通最小二乘法(Ordinary Least Squares,OLS)
# 1、獲取數據並解析數據到變數X和Y中
X=[]
Y=[]
with open('data_singlevar.txt','r') as f:
    for line in f.readlines():
        data = [float(i) for i in line.split(',')]
        xt,yt=data[:-1],data[-1]
        X.append(xt)
        Y.append(yt)
# 2、將數據分為訓練集和測試集,各為80%,20%
num_training=int(0.8*len(X))
num_test=len(X)-num_training

X_training=np.array(X[0:num_training])
Y_training=np.array(Y[0:num_training])

X_test=np.array(X[num_training:])
Y_test=np.array(Y[num_training:])

# 3、創建回歸器對象
from sklearn import linear_model
linear_regressor=linear_model.LinearRegression()
linear_regressor.fit(X_training,Y_training)#訓練
# 4、獲取預測數據,並將其顯示
import matplotlib.pyplot as plot
y_train_pred=linear_regressor.predict(X_training)
plot.figure()
plot.scatter(X_training,Y_training,color='green')
plot.plot(X_training,y_train_pred,color='black')
plot.title('數據顯示')
plot.show()
# 5、驗證測試數據,並顯示

y_test_pred=linear_regressor.predict(X_test)
plot.figure()
plot.scatter(X_test,Y_test,color='green')
plot.plot(X_test,y_test_pred,color='black')
plot.title('數據顯示')
plot.show() 

4、計算回歸準確性

評價回歸器的擬合效果,簡述幾個衡量回歸器效果的重要指標(metric):

  • 平均絕對誤差(mean absolute error):所有數據點的絕對誤差平均值。
  • 均方誤差(mean squared error):所有點的誤差的平方的平均值(常用)。
  • 中位數軍隊誤差(median absolute error):所有點的誤差的中位數。優點是可以消除異常值的干擾
  • 解釋方差分(explained variance acore):用於衡量模型對數據集波動的解釋能力。
  • R方得分(R2 score):確定性關係繫數,用於衡量模型對未知樣本預測的效果,最好1.0,值也可負數。
    scikit-learn裡面有一塊模塊,提供了計算所有指標的功能。

    import sklearn.metrics as sm
    
    print('平均絕對誤差:',round(sm.mean_absolute_error(Y_test,y_test_pred)))
    print('均方誤差:',round(sm.mean_squared_error(Y_test,y_test_pred)))
    print('中位數絕對誤差:',round(sm.median_absolute_error(Y_test,y_test_pred)))
    print('解釋方差分:',round(sm.explained_variance_score(Y_test,y_test_pred)))
    print('R方得分:',round(sm.r2_score(Y_test,y_test_pred)))

    通常儘量保證均方誤差最低,而解釋方差分最高

5、保存模型

模型訓練結束之後,為下次使用方便,可以保存模型。

# 保存模型
import pickle  as p
with open('saved_model_output.pkl','wb') as f:
    p.dump(linear_regressor,f)
#載入模型,載入的便是linear_regressor
with open('saved_model_output.pkl','rb') as f:
    model_liner=p.load(f)
y_pre=model_liner.predict(X_test)

6、嶺回歸器

普通最小二乘法在建模時會考慮異常值的影響,所以使得模型不是最優,這裡引入正則化項的繫數作為闕值來消除異常值影響,該方法稱嶺回歸

#alpha趨於0時,嶺回歸器就是普通最小乘法的線性回歸器,若希望對異常值不敏感,設為大一點
ridge_regressor=linear_model.Ridge(alpha=1,fit_intercept=True,max_iter=10000)
ridge_regressor.fit(X_training,Y_training)
y_test_pred_ridge=ridge_regressor.predict(X_test)
plot.figure()
plot.scatter(X_test,Y_test,color='green')
plot.plot(X_test,y_test_pred_ridge,color='black')
plot.title('train數據顯示')
plot.show()

print('平均絕對誤差:',round(sm.mean_absolute_error(Y_test,y_test_pred_ridge)))
print('均方誤差:',round(sm.mean_squared_error(Y_test,y_test_pred_ridge)))
print('中位數絕對誤差:',round(sm.median_absolute_error(Y_test,y_test_pred_ridge)))
print('解釋方差分:',round(sm.explained_variance_score(Y_test,y_test_pred_ridge)))
print('R方得分:',round(sm.r2_score(Y_test,y_test_pred_ridge)))

7、創建多項式回歸器

若數據中帶有曲線,線性模型不能捕捉到,因為線性回歸模型只能擬合直線;所以這裡可通過擬合多項式方程來剋服這類問題,提高模型的準確性,但是隨著曲線率增加,使得擬合速度變慢,所以曲線率的大小需綜合考量。

# 創建多項式回歸器
quadratic_featurizer = preprocessing.PolynomialFeatures(degree=5)#獲取多項式對象,degree的值越大,模型的越準確
X_train_quadratic = quadratic_featurizer.fit_transform(X_training)#獲得多項式形式的輸入
xx=np.linspace(-6,4,100)#曲線顯示
regressor_quadratic = linear_model.LinearRegression()
regressor_quadratic.fit(X_train_quadratic, Y_training)
xx_quadratic = quadratic_featurizer.fit_transform(xx.reshape(xx.shape[0], 1))#獲得多項式形式的輸入
yy_pre=regressor_quadratic.predict(xx_quadratic)#獲取預測值

plot.figure()
plot.scatter(X_training,Y_training,color='green')
plot.plot(xx,yy_pre , 'r-')
plot.title('train數據顯示')
plot.show()

8、例子

1.估算房屋價格

使用帶AdaBoost演算法的決策樹回歸器(decision tree regressor)。決策樹是一個樹裝模型,每一個節點都做出一個決策,從而影響最終結果,葉子節點表示輸出數值,分支表示根據輸入特征做出的中間決策。AdaBoost演算法是指自適應增強(adaptive boosting)演算法,這是一種利用其它系統增強模型準確性的技術。這種技術是將不同版本的演算法結果進行組合,用加權彙總的方式獲得最終結果,被稱為弱學習器*(weak learners).使用詳細例子如下:

# 估算房屋價格
import numpy as np
from sklearn import datasets
from sklearn.utils import shuffle
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import AdaBoostRegressor
from sklearn.metrics import mean_squared_error,explained_variance_score
import matplotlib.pyplot as plt

# 1、獲取標準房屋價格資料庫,scikit-learn提供介面
housing_data=datasets.load_boston()
# 2、將數據分入到X,Y中,並通過shuffle打亂數據,random_state控制如何打亂順序
X,y=shuffle(housing_data.data,housing_data.target,random_state=7)
# 3、80%訓練數據,20%測試數據
num_training=int(0.8*len(X))
X_train,y_train=X[0:num_training],y[0:num_training]
X_test,y_test=X[num_training:],y[num_training:]
# 4、擬合決策樹模型,並限制最大深度為4
dt_regressor=DecisionTreeRegressor(max_depth=4)
dt_regressor.fit(X_train,y_train)
# 5、用帶AdaBoost演算法
ab_regressor=AdaBoostRegressor(DecisionTreeRegressor(max_depth=4),n_estimators=400,random_state=4)
ab_regressor.fit(X_train,y_train)
# 6、評估決策樹模型測試結果,儘量保證均方誤差最低,而解釋方差分最高
y_dt_pred=dt_regressor.predict(X_test)
print('均方差:',mean_squared_error(y_test,y_dt_pred))
print('解釋方差:',explained_variance_score(y_test,y_dt_pred))
# 7、評估AdaBoost測試結果,同上
y_ab_pred=ab_regressor.predict(X_test)
print('均方差:',mean_squared_error(y_test,y_ab_pred))
print('解釋方差:',explained_variance_score(y_test,y_ab_pred))

def plot_feature_importances(feature_importances,title,feature_names):
    feature_importances=100*(feature_importances/max(feature_importances))
    index_sorted=np.flipud(np.argsort(feature_importances))#argsort獲得數值從小到大排序的索引,flipud反序
    pos=np.arange(index_sorted.shape[0])+0.5

    plt.figure()
    plt.bar(pos,feature_importances[index_sorted],align='center')
    plt.xticks(pos,feature_names[index_sorted])
    plt.title(title)
    plt.show()

plot_feature_importances(dt_regressor.feature_importances_,'dt',housing_data.feature_names)
plot_feature_importances(ab_regressor.feature_importances_,'dt',housing_data.feature_names)

2.評估共用單車

採用隨機森立回歸器(random forest regressor);隨機森林是一個決策樹集合,基本上是用一組有數據集的若幹子集構建的決策樹構成,再用決策樹平均值改善整體學習效果。使用例子如下:

# 評估共用單車重要因素
import csv
from sklearn.ensemble import RandomForestRegressor

# 1、讀取數據,該數據是從文件中讀取
def load_datasets(filename):
    file_reader=csv.reader(open(filename,'r'),delimiter=',')
    X=[]
    y=[]
    for row in file_reader:
        X.append(row[2:13])
        y.append(row[-1])

    feature_name=np.array(X[0])

    return np.array(X[1:]).astype(np.float32),np.array(y[1:]).astype(np.float32),feature_name

# 2、獲取數據並將文件打亂放入X,y中
X,y,feature_name=load_datasets('bike_day.csv')
X,y=shuffle(X,y,random_state=7)
# 3、將數據分成0.9訓練和0.1的測試數據
num_training=int(len(X)*0.9)
X_train,y_train=X[:num_training],y[:num_training]
X_test,y_test=X[num_training:],y[num_training:]
# 4、訓練回歸
# #n_estimators指評估器的數量,則決策樹數量,min_samples_split指決策樹分裂一個節點需要用到的最小數據樣本量
rf_regressor=RandomForestRegressor(n_estimators=1000,max_depth=10,min_samples_split=2)
rf_regressor.fit(X_train,y_train)
# 5、評價隨機森林回歸的效果
y_pre=rf_regressor.predict(X_test)
print('均方差:',mean_squared_error(y_test,y_pre))
print('解釋方差:',explained_variance_score(y_test,y_pre))

plot_feature_importances(rf_regressor.feature_importances_,'rf',feature_name)

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 引言 - 一時心起, libuv linux 搭建 有一天突然想起來想寫個動畫. 找了一下 ui 庫太大. 後面想起以前弄過的 libuv. 但發現 libuv 相關資料也很少. 所以就有了這些內容. libuv - https://github.com/libuv/libuv libuv 在 li ...
  • 這個工具類,用線程的方式實現文件的複製,效果勉強還算可以。功能不夠完善。 根據兩個路徑字元串(文件路徑或文件夾路徑),實現文件的複製,具體用的方法,註釋還算清楚。 不能在構造方法里拋出異常,好難受。 ...
  • 1# 判斷二元一次方程ax+by=c是否有整數解: c%gcd(a,b) == 0 2# ab的最小公倍數 = a*b/最大公約數 3# 最大公約數: 輾轉相除法 4# n進位的轉換用% / +迴圈/遞歸來解決. 5# a&1判斷一個數是奇數還是偶數 6# 高精度加法,乘法原理: 7# 整數a/b向 ...
  • UI界面展示: 3D模型界面: 灰度分佈界面: 下麵是源程式: 下一個任務:進行邊界檢測 思路: 文中圖片 鏈接:鏈接:https://pan.baidu.com/s/1hsImLla 密碼:m2ip ...
  • 最近在學django框架,準備用django寫一個博客園的系統,並且在寫的過程中也遇到一些問題,實踐出真知,對django開發web應用方面也有了進一步的瞭解。很多操作實現都是以我所認知的技術完成的,可能存在不合理的地方(畢竟實現的方法多種多樣),基本完成後會將源碼上傳到git,也歡迎各位大神指正。 ...
  • 這次爬取的網站是糗事百科,網址是:http://www.qiushibaike.com/hot/page/1 分析網址,參數'page/'後面的數字'1'指的是頁數,第二頁就是'/page/2',以此類推。。。 一、分析網頁 網頁圖片 然後明確要爬取的元素:作者名、內容、好笑數、以及評論數量 每一個 ...
  • 題目描述 Farmer John has N barren pastures (2 <= N <= 100,000) connected by N-1 bidirectional roads, such that there is exactly one path between any two p ...
  • 一般Web工程通過Jenkins遠程部署到Tomcat,可以採用Maven的tomcat-maven-plugin插件進行部署。最近接觸到Spring Boot工程的部署,由於Spring Boot應用可以使用內部集成的服務容器(如Tomcat),此時無需按原來的方法進行部署。以工程asset_we ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...