日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

机器学习:sklearn数据集与机器学习组成

發(fā)布時間:2024/7/5 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习:sklearn数据集与机器学习组成 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

機(jī)器學(xué)習(xí)組成:模型、策略、優(yōu)化

《統(tǒng)計機(jī)器學(xué)習(xí)》中指出:機(jī)器學(xué)習(xí)=模型+策略+算法。其實(shí)機(jī)器學(xué)習(xí)可以表示為:Learning= Representation+Evalution+Optimization。我們就可以將這樣的表示和李航老師的說法對應(yīng)起來。機(jī)器學(xué)習(xí)主要是由三部分組成,即:表示(模型)、評價(策略)和優(yōu)化(算法)。

表示(或者稱為:模型):Representation

表示主要做的就是建模,故可以稱為模型。模型要完成的主要工作是轉(zhuǎn)換:將實(shí)際問題轉(zhuǎn)化成為計算機(jī)可以理解的問題,就是我們平時說的建模。類似于傳統(tǒng)的計算機(jī)學(xué)科中的算法,數(shù)據(jù)結(jié)構(gòu),如何將實(shí)際的問題轉(zhuǎn)換成計算機(jī)可以表示的方式。這部分可以見“簡單易學(xué)的機(jī)器學(xué)習(xí)算法”。給定數(shù)據(jù),我們怎么去選擇對應(yīng)的問題去解決,選擇正確的已有的模型是重要的一步。

評價(或者稱為:策略):Evalution

評價的目標(biāo)是判斷已建好的模型的優(yōu)劣。對于第一步中建好的模型,評價是一個指標(biāo),用于表示模型的優(yōu)劣。這里就會是一些評價的指標(biāo)以及一些評價函數(shù)的設(shè)計。在機(jī)器學(xué)習(xí)中會有針對性的評價指標(biāo)。

  • 分類問題

優(yōu)化:Optimization

優(yōu)化的目標(biāo)是評價的函數(shù),我們是希望能夠找到最好的模型,也就是說評價最高的模型。

開發(fā)機(jī)器學(xué)習(xí)應(yīng)用程序的步驟

(1)收集數(shù)據(jù)

我們可以使用很多方法收集樣本護(hù)具,如:制作網(wǎng)絡(luò)爬蟲從網(wǎng)站上抽取數(shù)據(jù)、從RSS反饋或者API中得到信息、設(shè)備發(fā)送過來的實(shí)測數(shù)據(jù)。

(2)準(zhǔn)備輸入數(shù)據(jù)

得到數(shù)據(jù)之后,還必須確保數(shù)據(jù)格式符合要求。

(3)分析輸入數(shù)據(jù)

這一步的主要作用是確保數(shù)據(jù)集中沒有垃圾數(shù)據(jù)。如果是使用信任的數(shù)據(jù)來源,那么可以直接跳過這個步驟

(4)訓(xùn)練算法

機(jī)器學(xué)習(xí)算法從這一步才真正開始學(xué)習(xí)。如果使用無監(jiān)督學(xué)習(xí)算法,由于不存在目標(biāo)變量值,故而也不需要訓(xùn)練算法,所有與算法相關(guān)的內(nèi)容在第(5)步

(5)測試算法

這一步將實(shí)際使用第(4)步機(jī)器學(xué)習(xí)得到的知識信息。當(dāng)然在這也需要評估結(jié)果的準(zhǔn)確率,然后根據(jù)需要重新訓(xùn)練你的算法

(6)使用算法

轉(zhuǎn)化為應(yīng)用程序,執(zhí)行實(shí)際任務(wù)。以檢驗(yàn)上述步驟是否可以在實(shí)際環(huán)境中正常工作。如果碰到新的數(shù)據(jù)問題,同樣需要重復(fù)執(zhí)行上述的步驟

一、scikit-learn數(shù)據(jù)集

我們將介紹sklearn中的數(shù)據(jù)集類,模塊包括用于加載數(shù)據(jù)集的實(shí)用程序,包括加載和獲取流行參考數(shù)據(jù)集的方法。它還具有一些人工數(shù)據(jù)生成器。

sklearn.datasets

(1)datasets.load_*()

獲取小規(guī)模數(shù)據(jù)集,數(shù)據(jù)包含在datasets里

(2)datasets.fetch_*()

獲取大規(guī)模數(shù)據(jù)集,需要從網(wǎng)絡(luò)上下載,函數(shù)的第一個參數(shù)是data_home,表示數(shù)據(jù)集下載的目錄,默認(rèn)是 ~/scikit_learn_data/,要修改默認(rèn)目錄,可以修改環(huán)境變量SCIKIT_LEARN_DATA

(3)datasets.make_*()

本地生成數(shù)據(jù)集

load*和 fetch* 函數(shù)返回的數(shù)據(jù)類型是 datasets.base.Bunch,本質(zhì)上是一個 dict,它的鍵值對可用通過對象的屬性方式訪問。主要包含以下屬性:

  • data:特征數(shù)據(jù)數(shù)組,是 n_samples * n_features 的二維 numpy.ndarray 數(shù)組

  • target:標(biāo)簽數(shù)組,是 n_samples 的一維 numpy.ndarray 數(shù)組

  • DESCR:數(shù)據(jù)描述

  • feature_names:特征名

  • target_names:標(biāo)簽名

數(shù)據(jù)集目錄可以通過datasets.get_data_home()獲取,clear_data_home(data_home=None)刪除所有下載數(shù)據(jù)

  • datasets.get_data_home(data_home=None)

返回scikit學(xué)習(xí)數(shù)據(jù)目錄的路徑。這個文件夾被一些大的數(shù)據(jù)集裝載器使用,以避免下載數(shù)據(jù)。默認(rèn)情況下,數(shù)據(jù)目錄設(shè)置為用戶主文件夾中名為“scikit_learn_data”的文件夾。或者,可以通過“SCIKIT_LEARN_DATA”環(huán)境變量或通過給出顯式的文件夾路徑以編程方式設(shè)置它。'?'符號擴(kuò)展到用戶主文件夾。如果文件夾不存在,則會自動創(chuàng)建。

  • sklearn.datasets.clear_data_home(data_home=None)

刪除存儲目錄中的數(shù)據(jù)

獲取小數(shù)據(jù)集

用于分類

  • sklearn.datasets.load_iris
class sklearn.datasets.load_iris(return_X_y=False)"""加載并返回虹膜數(shù)據(jù)集:param return_X_y: 如果為True,則返回而不是Bunch對象,默認(rèn)為False:return: Bunch對象,如果return_X_y為True,那么返回tuple,(data,target)""" In [12]: from sklearn.datasets import load_iris...: data = load_iris()...:In [13]: data.target Out[13]: array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])In [14]: data.feature_names Out[14]: ['sepal length (cm)','sepal width (cm)','petal length (cm)','petal width (cm)']In [15]: data.target_names Out[15]: array(['setosa', 'versicolor', 'virginica'],dtype='|S10')In [17]: data.target[[1,10, 100]] Out[17]: array([0, 0, 2]) 名稱數(shù)量
類別3
特征4
樣本數(shù)量150
每個類別數(shù)量50
  • sklearn.datasets.load_digits
class sklearn.datasets.load_digits(n_class=10, return_X_y=False)"""加載并返回數(shù)字?jǐn)?shù)據(jù)集:param n_class: 整數(shù),介于0和10之間,可選(默認(rèn)= 10,要返回的類的數(shù)量:param return_X_y: 如果為True,則返回而不是Bunch對象,默認(rèn)為False:return: Bunch對象,如果return_X_y為True,那么返回tuple,(data,target)""" In [20]: from sklearn.datasets import load_digitsIn [21]: digits = load_digits()In [22]: print(digits.data.shape) (1797, 64)In [23]: digits.target Out[23]: array([0, 1, 2, ..., 8, 9, 8])In [24]: digits.target_names Out[24]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])In [25]: digits.images Out[25]: array([[[ 0., 0., 5., ..., 1., 0., 0.],[ 0., 0., 13., ..., 15., 5., 0.],[ 0., 3., 15., ..., 11., 8., 0.],...,[ 0., 4., 11., ..., 12., 7., 0.],[ 0., 2., 14., ..., 12., 0., 0.],[ 0., 0., 6., ..., 0., 0., 0.]],[[ 0., 0., 10., ..., 1., 0., 0.],[ 0., 2., 16., ..., 1., 0., 0.],[ 0., 0., 15., ..., 15., 0., 0.],...,[ 0., 4., 16., ..., 16., 6., 0.],[ 0., 8., 16., ..., 16., 8., 0.],[ 0., 1., 8., ..., 12., 1., 0.]]]) 名稱數(shù)量
類別10
特征64
樣本數(shù)量1797

用于回歸

  • sklearn.datasets.load_boston
class sklearn.datasets.load_boston(return_X_y=False)"""加載并返回波士頓房價數(shù)據(jù)集:param return_X_y: 如果為True,則返回而不是Bunch對象,默認(rèn)為False:return: Bunch對象,如果return_X_y為True,那么返回tuple,(data,target)""" In [34]: from sklearn.datasets import load_bostonIn [35]: boston = load_boston()In [36]: boston.data.shape Out[36]: (506, 13)In [37]: boston.feature_names Out[37]: array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT'],dtype='|S7')In [38]: 名稱數(shù)量
目標(biāo)類別5-50
特征13
樣本數(shù)量506
  • sklearn.datasets.load_diabetes
class sklearn.datasets.load_diabetes(return_X_y=False)"""加載和返回糖尿病數(shù)據(jù)集:param return_X_y: 如果為True,則返回而不是Bunch對象,默認(rèn)為False:return: Bunch對象,如果return_X_y為True,那么返回tuple,(data,target)""" In [13]: from sklearn.datasets import load_diabetesIn [14]: diabetes = load_diabetes()In [15]: diabetes.data Out[15]: array([[ 0.03807591, 0.05068012, 0.06169621, ..., -0.00259226,0.01990842, -0.01764613],[-0.00188202, -0.04464164, -0.05147406, ..., -0.03949338,-0.06832974, -0.09220405],[ 0.08529891, 0.05068012, 0.04445121, ..., -0.00259226,0.00286377, -0.02593034],...,[ 0.04170844, 0.05068012, -0.01590626, ..., -0.01107952,-0.04687948, 0.01549073],[-0.04547248, -0.04464164, 0.03906215, ..., 0.02655962,0.04452837, -0.02593034],[-0.04547248, -0.04464164, -0.0730303 , ..., -0.03949338,-0.00421986, 0.00306441]]) 名稱數(shù)量
目標(biāo)范圍25-346
特征10
樣本數(shù)量442

獲取大數(shù)據(jù)集

  • sklearn.datasets.fetch_20newsgroups
class sklearn.datasets.fetch_20newsgroups(data_home=None, subset='train', categories=None, shuffle=True, random_state=42, remove=(), download_if_missing=True)"""加載20個新聞組數(shù)據(jù)集中的文件名和數(shù)據(jù):param subset: 'train'或者'test','all',可選,選擇要加載的數(shù)據(jù)集:訓(xùn)練集的“訓(xùn)練”,測試集的“測試”,兩者的“全部”,具有洗牌順序:param data_home: 可選,默認(rèn)值:無,指定數(shù)據(jù)集的下載和緩存文件夾。如果沒有,所有scikit學(xué)習(xí)數(shù)據(jù)都存儲在'?/ scikit_learn_data'子文件夾中:param categories: 無或字符串或Unicode的集合,如果沒有(默認(rèn)),加載所有類別。如果不是無,要加載的類別名稱列表(忽略其他類別):param shuffle: 是否對數(shù)據(jù)進(jìn)行洗牌:param random_state: numpy隨機(jī)數(shù)生成器或種子整數(shù):param download_if_missing: 可選,默認(rèn)為True,如果False,如果數(shù)據(jù)不在本地可用而不是嘗試從源站點(diǎn)下載數(shù)據(jù),則引發(fā)IOError:param remove: 元組""" In [29]: from sklearn.datasets import fetch_20newsgroupsIn [30]: data_test = fetch_20newsgroups(subset='test',shuffle=True, random_sta...: te=42)In [31]: data_train = fetch_20newsgroups(subset='train',shuffle=True, random_s...: tate=42)
  • sklearn.datasets.fetch_20newsgroups_vectorized
class sklearn.datasets.fetch_20newsgroups_vectorized(subset='train', remove=(), data_home=None)"""加載20個新聞組數(shù)據(jù)集并將其轉(zhuǎn)換為tf-idf向量,這是一個方便的功能; 使用sklearn.feature_extraction.text.Vectorizer的默認(rèn)設(shè)置完成tf-idf 轉(zhuǎn)換。對于更高級的使用(停止詞過濾,n-gram提取等),將fetch_20newsgroup與自定義Vectorizer或CountVectorizer組合在一起:param subset: 'train'或者'test','all',可選,選擇要加載的數(shù)據(jù)集:訓(xùn)練集的“訓(xùn)練”,測試集的“測試”,兩者的“全部”,具有洗牌順序:param data_home: 可選,默認(rèn)值:無,指定數(shù)據(jù)集的下載和緩存文件夾。如果沒有,所有scikit學(xué)習(xí)數(shù)據(jù)都存儲在'?/ scikit_learn_data'子文件夾中:param remove: 元組""" In [57]: from sklearn.datasets import fetch_20newsgroups_vectorizedIn [58]: bunch = fetch_20newsgroups_vectorized(subset='all')In [59]: from sklearn.utils import shuffleIn [60]: X, y = shuffle(bunch.data, bunch.target)...: offset = int(X.shape[0] * 0.8)...: X_train, y_train = X[:offset], y[:offset]...: X_test, y_test = X[offset:], y[offset:]...:

獲取本地生成數(shù)據(jù)

生成本地分類數(shù)據(jù):

  • sklearn.datasets.make_classification

    class make_classification(n_samples=100, n_features=20, n_informative=2, n_redundant=2, n_repeated=0, n_classes=2, n_clusters_per_class=2, weights=None, flip_y=0.01, class_sep=1.0, hypercube=True, shift=0.0, scale=1.0, shuffle=True, random_state=None) """ 生成用于分類的數(shù)據(jù)集:param n_samples:int,optional(default = 100),樣本數(shù)量:param n_features:int,可選(默認(rèn)= 20),特征總數(shù):param n_classes:int,可選(default = 2),類(或標(biāo)簽)的分類問題的數(shù)量:param random_state:int,RandomState實(shí)例或無,可選(默認(rèn)=無)如果int,random_state是隨機(jī)數(shù)生成器使用的種子; 如果RandomState的實(shí)例,random_state是隨機(jī)數(shù)生成器; 如果沒有,隨機(jī)數(shù)生成器所使用的RandomState實(shí)例np.random:return :X,特征數(shù)據(jù)集;y,目標(biāo)分類值 """
from sklearn.datasets.samples_generator import make_classification X,y= datasets.make_classification(n_samples=100000, n_features=20,n_informative=2, n_redundant=10,random_state=42)

生成本地回歸數(shù)據(jù):

  • sklearn.datasets.make_regression
class make_regression(n_samples=100, n_features=100, n_informative=10, n_targets=1, bias=0.0, effective_rank=None, tail_strength=0.5, noise=0.0, shuffle=True, coef=False, random_state=None)"""生成用于回歸的數(shù)據(jù)集:param n_samples:int,optional(default = 100),樣本數(shù)量:param n_features:int,optional(default = 100),特征數(shù)量:param coef:boolean,optional(default = False),如果為True,則返回底層線性模型的系數(shù):param random_state:int,RandomState實(shí)例或無,可選(默認(rèn)=無)如果int,random_state是隨機(jī)數(shù)生成器使用的種子; 如果RandomState的實(shí)例,random_state是隨機(jī)數(shù)生成器; 如果沒有,隨機(jī)數(shù)生成器所使用的RandomState實(shí)例np.random:return :X,特征數(shù)據(jù)集;y,目標(biāo)值""" from sklearn.datasets.samples_generator import make_regression X, y = make_regression(n_samples=200, n_features=5000, random_state=42)

二、模型的選擇

算法是核心,數(shù)據(jù)和計算是基礎(chǔ)。這句話很好的說明了機(jī)器學(xué)習(xí)中算法的重要性。那么我們開看下機(jī)器學(xué)習(xí)的幾種分類:

  • 監(jiān)督學(xué)習(xí)
    • 分類 k-近鄰算法、決策樹、貝葉斯、邏輯回歸(LR)、支持向量機(jī)(SVM)
    • 回歸 線性回歸、嶺回歸
    • 標(biāo)注 隱馬爾可夫模型(HMM)
  • 無監(jiān)督學(xué)習(xí)
    • 聚類 k-means

如何選擇合適的算法模型

在解決問題的時候,必須考慮下面兩個問題:一、使用機(jī)器學(xué)習(xí)算法的目的,想要算法完成何種任務(wù),比如是預(yù)測明天下雨的概率是對投票者按照興趣分組;二、需要分析或者收集的數(shù)據(jù)時什么

首先考慮使用機(jī)器學(xué)習(xí)算法的目的。如果想要預(yù)測目標(biāo)變量的值,則可以選擇監(jiān)督學(xué)習(xí)算法,否則可以選擇無監(jiān)督學(xué)習(xí)算法,確定選擇監(jiān)督學(xué)習(xí)算法之后,需要進(jìn)一步確定目標(biāo)變量類型,如果目標(biāo)變量是離散型,如是/否、1/2/3,A/B/C/或者紅/黑/黃等,則可以選擇分類算法;如果目標(biāo)變量是連續(xù)的數(shù)值,如0.0~100.0、-999~999等,則需要選擇回歸算法

如果不想預(yù)測目標(biāo)變量的值,則可以選擇無監(jiān)督算法。進(jìn)一步分析是否需要將數(shù)據(jù)劃分為離散的組。如果這是唯一的需求,則使用聚類算法。

當(dāng)然在大多數(shù)情況下,上面給出的選擇辦法都能幫助讀者選擇恰當(dāng)?shù)臋C(jī)器學(xué)習(xí)算法,但這也并非已成不變。也有分類算法可以用于回歸。

其次考慮的是數(shù)據(jù)問題,我們應(yīng)該充分了解數(shù)據(jù),對實(shí)際數(shù)據(jù)了解的越充分,越容易創(chuàng)建符合實(shí)際需求的應(yīng)用程序,主要應(yīng)該了解數(shù)據(jù)的一下特性:特征值是 離散型變量 還是 連續(xù)型變量 ,特征值中是否存在缺失的值,何種原因造成缺失值,數(shù)據(jù)中是夠存在異常值,某個特征發(fā)生的頻率如何,等等。充分了解上面提到的這些數(shù)據(jù)特性可以縮短選擇機(jī)器學(xué)習(xí)算法的時間。

監(jiān)督學(xué)習(xí)中三類問題的解釋

(1)分類問題分類是監(jiān)督學(xué)習(xí)的一個核心問題,在監(jiān)督學(xué)習(xí)中,當(dāng)輸出變量取有限個離散值時,預(yù)測問題變成為分類問題。這時,輸入變量可以是離散的,也可以是連續(xù)的。監(jiān)督學(xué)習(xí)從數(shù)據(jù)中學(xué)習(xí)一個分類模型活分類決策函數(shù),稱為分類器。分類器對新的輸入進(jìn)行輸出的預(yù)測,稱為分類。最基礎(chǔ)的便是二分類問題,即判斷是非,從兩個類別中選擇一個作為預(yù)測結(jié)果;除此之外還有多酚類的問題,即在多于兩個類別中選擇一個。


分類問題包括學(xué)習(xí)和分類兩個過程,在學(xué)習(xí)過程中,根據(jù)已知的訓(xùn)練數(shù)據(jù)集利用有效的學(xué)習(xí)方法學(xué)習(xí)一個分類器,在分類過程中,利用學(xué)習(xí)的分類器對新的輸入實(shí)例進(jìn)行分類。圖中(X1,Y1),(X2,Y2)...都是訓(xùn)練數(shù)據(jù)集,學(xué)習(xí)系統(tǒng)有訓(xùn)練數(shù)據(jù)學(xué)習(xí)一個分類器P(Y|X)或Y=f(X);分類系統(tǒng)通過學(xué)習(xí)到的分類器對于新輸入的實(shí)例子Xn+1進(jìn)行分類,即預(yù)測術(shù)其輸出的雷標(biāo)記Yn+1

分類在于根據(jù)其特性將數(shù)據(jù)“分門別類”,所以在許多領(lǐng)域都有廣泛的應(yīng)用。例如,在銀行業(yè)務(wù)中,可以構(gòu)建一個客戶分類模型,按客戶按照貸款風(fēng)險的大小進(jìn)行分類;在網(wǎng)絡(luò)安全領(lǐng)域,可以利用日志數(shù)據(jù)的分類對非法入侵進(jìn)行檢測;在圖像處理中,分類可以用來檢測圖像中是否有人臉出現(xiàn);在手寫識別中,分類可以用于識別手寫的數(shù)字;在互聯(lián)網(wǎng)搜索中,網(wǎng)頁的分類可以幫助網(wǎng)頁的抓取、索引和排序。

即一個分類應(yīng)用的例子,文本分類。這里的文本可以是新聞報道、網(wǎng)頁、電子郵件、學(xué)術(shù)論文。類別往往是關(guān)于文本內(nèi)容的。例如政治、體育、經(jīng)濟(jì)等;也有關(guān)于文本特點(diǎn)的,如正面意見、反面意見;還可以根據(jù)應(yīng)用確定,如垃圾郵件、非垃圾郵件等。文本分類是根據(jù)文本的特征將其劃分到已有的類中。輸入的是文本的特征向量,輸出的是文本的類別。通常把文本的單詞定義出現(xiàn)取值是1,否則是0;也可以是多值的,,表示單詞在文本中出現(xiàn)的頻率。直觀地,如果“股票”“銀行““貨幣”這些詞出現(xiàn)很多,這個文本可能屬于經(jīng)濟(jì)學(xué),如果“網(wǎng)球””比賽“”運(yùn)動員“這些詞頻繁出現(xiàn),這個文本可能屬于體育類

(2)回歸問題

回歸是監(jiān)督學(xué)習(xí)的另一個重要問題。回歸用于預(yù)測輸入變量和輸出變量之間的關(guān)系,特別是當(dāng)初如變量的值發(fā)生變化時,輸出變量的值隨之發(fā)生的變化。回歸模型正式表示從輸入到輸出變量之間映射的函數(shù)。回歸穩(wěn)日的學(xué)習(xí)等價與函數(shù)擬合:選擇一條函數(shù)曲線使其更好的擬合已知數(shù)據(jù)且很好的預(yù)測位置數(shù)據(jù)

回歸問題按照輸入變量的個數(shù),分為一元回歸和多元回歸;按照輸入變量和輸出變量之間關(guān)系的類型即模型的類型,分為線性回歸和非線性回歸。

許多領(lǐng)域的任務(wù)都可以形式化為回歸問題,比如,回歸可以用于商務(wù)領(lǐng)域,作為市場趨勢預(yù)測、產(chǎn)品質(zhì)量管理、客戶滿意度調(diào)查、偷襲風(fēng)險分析的工具。

(3)標(biāo)注問題

標(biāo)注也是一個監(jiān)督學(xué)習(xí)問題。可以認(rèn)為標(biāo)注問題是分類問題的一個推廣,標(biāo)注問題又是更復(fù)雜的結(jié)構(gòu)預(yù)測問題的簡單形式。標(biāo)注問題的輸入是一個觀測序列,輸出是一個標(biāo)記序列或狀態(tài)序列。標(biāo)注問題在信息抽取、自然語言處理等領(lǐng)域廣泛應(yīng)用,是這些領(lǐng)域的基本問題。例如,自然語言處理的詞性標(biāo)注就是一個典型的標(biāo)注,即對一個單詞序列預(yù)測其相應(yīng)的詞性標(biāo)記序

當(dāng)然我們主要關(guān)注的是分類和回歸問題,并且標(biāo)注問題的算法復(fù)雜

三、模型檢驗(yàn)-交叉驗(yàn)證

一般在進(jìn)行模型的測試時,我們會將數(shù)據(jù)分為訓(xùn)練集和測試集。在給定的樣本空間中,拿出大部分樣本作為訓(xùn)練集來訓(xùn)練模型,剩余的小部分樣本使用剛建立的模型進(jìn)行預(yù)測。

訓(xùn)練集與測試集

訓(xùn)練集與測試集的分割可以使用cross_validation中的train_test_split方法,大部分的交叉驗(yàn)證迭代器都內(nèi)建一個劃分?jǐn)?shù)據(jù)前進(jìn)行數(shù)據(jù)索引打散的選項(xiàng),train_test_split 方法內(nèi)部使用的就是交叉驗(yàn)證迭代器。默認(rèn)不會進(jìn)行打散,包括設(shè)置cv=some_integer(直接)k折疊交叉驗(yàn)證的cross_val_score會返回一個隨機(jī)的劃分。如果數(shù)據(jù)集具有時間性,千萬不要打散數(shù)據(jù)再劃分!

  • sklearn.cross_validation.train_test_split
def train_test_split(*arrays,**options)""":param arrays:允許的輸入是列表,數(shù)字陣列:param test_size:float,int或None(默認(rèn)為無),如果浮點(diǎn)數(shù)應(yīng)在0.0和1.0之間,并且表示要包括在測試拆分中的數(shù)據(jù)集的比例。如果int,表示測試樣本的絕對數(shù):param train_size:float,int或None(默認(rèn)為無),如果浮點(diǎn)數(shù)應(yīng)在0.0到1.0之間,表示數(shù)據(jù)集包含在列車拆分中的比例。如果int,表示列車樣本的絕對數(shù):param random_state:int或RandomState,用于隨機(jī)抽樣的偽隨機(jī)數(shù)發(fā)生器狀態(tài),參數(shù) random_state 默認(rèn)設(shè)置為 None,這意為著每次打散都是不同的。""" from sklearn.cross_validation import train_test_split from sklearn import datasetsiris = datasets.load_iris() print iris.data.shape,iris.target.shape X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.4, random_state=42) print X_train.shape,y_train.shape print X_test.shape,y_test.shape

上面的方式也有局限。因?yàn)橹贿M(jìn)行一次測試,并不一定能代表模型的真實(shí)準(zhǔn)確率。因?yàn)?#xff0c;模型的準(zhǔn)確率和數(shù)據(jù)的切分有關(guān)系,在數(shù)據(jù)量不大的情況下,影響尤其突出。所以還需要一個比較好的解決方案。

模型評估中,除了訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù),還會涉及到驗(yàn)證數(shù)據(jù)。使用訓(xùn)練數(shù)據(jù)與測試數(shù)據(jù)進(jìn)行了交叉驗(yàn)證,只有這樣訓(xùn)練出的模型才具有更可靠的準(zhǔn)確率,也才能期望模型在新的、未知的數(shù)據(jù)集上,能有更好的表現(xiàn)。這便是模型的推廣能力,也即泛化能力的保證。

holdout method

評估模型泛化能力的典型方法是holdout交叉驗(yàn)證(holdout cross validation)。holdout方法很簡單,我們只需要將原始數(shù)據(jù)集分割為訓(xùn)練集和測試集,前者用于訓(xùn)練模型,后者用于評估模型的性能。一般來說,Holdout 驗(yàn)證并非一種交叉驗(yàn)證,因?yàn)閿?shù)據(jù)并沒有交叉使用。 隨機(jī)從最初的樣本中選出部分,形成交叉驗(yàn)證數(shù)據(jù),而剩余的就當(dāng)做訓(xùn)練數(shù)據(jù)。 一般來說,少于原本樣本三分之一的數(shù)據(jù)被選做驗(yàn)證數(shù)據(jù)。所以這種方法得到的結(jié)果其實(shí)并不具有說服性

k-折交叉驗(yàn)證

K折交叉驗(yàn)證,初始采樣分割成K個子樣本,一個單獨(dú)的子樣本被保留作為驗(yàn)證模型的數(shù)據(jù),其他K-1個樣本用來訓(xùn)練。交叉驗(yàn)證重復(fù)K次,每個子樣本驗(yàn)證一次,平均K次的結(jié)果或者使用其它結(jié)合方式,最終得到一個單一估測。這個方法的優(yōu)勢在于,同時重復(fù)運(yùn)用隨機(jī)產(chǎn)生的子樣本進(jìn)行訓(xùn)練和驗(yàn)證,每次的結(jié)果驗(yàn)證一次,10折交叉驗(yàn)證是最常用的。

例如5折交叉驗(yàn)證,全部可用數(shù)據(jù)集分成五個集合,每次迭代都選其中的1個集合數(shù)據(jù)作為驗(yàn)證集,另外4個集合作為訓(xùn)練集,經(jīng)過5組的迭代過程。交叉驗(yàn)證的好處在于,可以保證所有數(shù)據(jù)都有被訓(xùn)練和驗(yàn)證的機(jī)會,也盡最大可能讓優(yōu)化的模型性能表現(xiàn)的更加可信。

使用交叉驗(yàn)證的最簡單的方法是在估計器和數(shù)據(jù)集上使用cross_val_score函數(shù)。

  • sklearn.cross_validation.cross_val_score
def cross_val_score(estimator, X, y=None, groups=None, scoring=None, cv=None, n_jobs=1, verbose=0, fit_params=None, pre_dispatch='2*n_jobs')""":param estimator:模型估計器:param X:特征變量集合:param y:目標(biāo)變量:param cv:int,使用默認(rèn)的3折交叉驗(yàn)證,整數(shù)指定一個(分層)KFold中的折疊數(shù):return :預(yù)估系數(shù)""" from sklearn.cross_validation import cross_val_score diabetes = datasets.load_diabetes() X = diabetes.data[:150] y = diabetes.target[:150] lasso = linear_model.Lasso() print(cross_val_score(lasso, X, y))

使用交叉驗(yàn)證方法的目的主要有2個:

  • 從有限的學(xué)習(xí)數(shù)據(jù)中獲取盡可能多的有效信息;
  • 可以在一定程度上避免過擬合問題。

四、estimator的工作流程

在sklearn中,估計器(estimator)是一個重要的角色,分類器和回歸器都屬于estimator。在估計器中有有兩個重要的方法是fit和transform。

  • fit方法用于從訓(xùn)練集中學(xué)習(xí)模型參數(shù)
  • transform用學(xué)習(xí)到的參數(shù)轉(zhuǎn)換數(shù)據(jù)

總結(jié)

以上是生活随笔為你收集整理的机器学习:sklearn数据集与机器学习组成的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。