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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > ChatGpt >内容正文

ChatGpt

AI基础:特征工程-数字特征处理

發(fā)布時(shí)間:2025/3/8 ChatGpt 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AI基础:特征工程-数字特征处理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

0.導(dǎo)語

特征工程到底是什么呢?顧名思義,其本質(zhì)是一項(xiàng)工程活動(dòng),目的是最大限度地從原始數(shù)據(jù)中提取特征以供算法和模型使用。

在此之前,我已經(jīng)寫了以下幾篇AI基礎(chǔ)的快速入門,本篇文章講解特征工程基礎(chǔ)第二部分:(數(shù)字特征處理)。

目前已經(jīng)發(fā)布:

AI 基礎(chǔ):Python 簡(jiǎn)易入門

AI 基礎(chǔ):Numpy 簡(jiǎn)易入門

AI 基礎(chǔ):Pandas 簡(jiǎn)易入門

AI 基礎(chǔ):Scipy(科學(xué)計(jì)算庫(kù)) 簡(jiǎn)易入門

AI基礎(chǔ):數(shù)據(jù)可視化簡(jiǎn)易入門(matplotlib和seaborn)

AI基礎(chǔ):特征工程-類別特征

后續(xù)持續(xù)更新

參考資料:

[1]原版(英文)圖書地址:?

https://www.oreilly.com/library/view/feature-engineering-for/9781491953235/
[2]翻譯來源apachecn:?

https://github.com/apachecn
[3]翻譯作者@coboe:?

https://github.com/coboe

代碼修改和整理:黃海廣,原文修改成jupyter notebook格式,并增加和修改了部分代碼,測(cè)試全部通過,所有數(shù)據(jù)集已經(jīng)放在百度云下載。

本文代碼可以在github下載:

https://github.com/fengdu78/Data-Science-Notes/tree/master/9.feature-engineering

數(shù)據(jù)集的百度云:

鏈接:https://pan.baidu.com/s/1uDXt5jWUOfI0fS7hD91vBQ?提取碼:8p5d

二、簡(jiǎn)單數(shù)字的奇特技巧

在深入研究諸如文本和圖像這樣的復(fù)雜數(shù)據(jù)類型之前,讓我們先從最簡(jiǎn)單的數(shù)字?jǐn)?shù)據(jù)開始。它們可能來自各種來源:地理位置或人、購(gòu)買的價(jià)格、傳感器的測(cè)量、交通計(jì)數(shù)等。數(shù)字?jǐn)?shù)據(jù)已經(jīng)是數(shù)學(xué)模型容易消化的格式。這并不意味著不再需要特征工程。好的特征不僅代表數(shù)據(jù)的顯著方面,而且符合模型的假設(shè)。因此,轉(zhuǎn)換常常是必要的。數(shù)字特征工程技術(shù)是基礎(chǔ)。當(dāng)原始數(shù)據(jù)被轉(zhuǎn)換為數(shù)字特征時(shí),它們可以被應(yīng)用。

數(shù)值數(shù)據(jù)的第一個(gè)健全檢查是大小是否重要。我們只需要知道它是正面的還是負(fù)面的?或者我們只需要知道一個(gè)非常粗粒度的大小?這一明智的檢查對(duì)于自動(dòng)累積數(shù)尤其重要,比如統(tǒng)計(jì),每天訪問網(wǎng)站的次數(shù),餐館所獲得的評(píng)論數(shù)量等等。

接下來,考慮特征的規(guī)模。最大值和最小值是什么?它們跨越幾個(gè)數(shù)量級(jí)嗎?輸入特性平滑的模型對(duì)輸入的尺度敏感。例如,3x+ 1是輸入X的簡(jiǎn)單線性函數(shù),其輸出的規(guī)模直接取決于輸入的比例。其他例子包括k-均值聚類,最近鄰居方法,RBF內(nèi)核,以及使用歐幾里得距離的任何東西。對(duì)于這些模型和建模組件,通常規(guī)范化特征以使輸出保持在預(yù)期的規(guī)模上通常是一個(gè)好主意。

另一方面,邏輯函數(shù)對(duì)輸入特征量表不敏感。無論輸入是什么,它們的輸出都是二進(jìn)制的。例如,邏輯,并采取任何兩個(gè)變量和輸出1,當(dāng)且僅當(dāng)兩個(gè)輸入均為真。邏輯函數(shù)的另一個(gè)例子是階躍函數(shù)“輸入x大于5”。決策樹模型由輸入特征的階躍函數(shù)組成。因此,基于空間劃分樹(決策樹、梯度提升機(jī)、隨機(jī)森林)的模型對(duì)尺度不敏感。唯一的例外是如果輸入的規(guī)模隨著時(shí)間的增長(zhǎng)而增長(zhǎng),那么如果該特征是某種類型的累積計(jì)數(shù)。最終它將生長(zhǎng)在樹被訓(xùn)練的范圍之外。如果可能是這樣的話,那么就有必要周期性地重新調(diào)整輸入。另一個(gè)解決方案是第5章討論的bin計(jì)數(shù)方法。

考慮數(shù)值特征的分布也是很重要的。分布總結(jié)了承擔(dān)特定價(jià)值的可能性。輸入特征的分布對(duì)某些模型比其他模型更重要。例如,線性回歸模型的訓(xùn)練過程假定預(yù)測(cè)誤差分布得像高斯。這通常是好的,除非預(yù)測(cè)目標(biāo)在幾個(gè)數(shù)量級(jí)上擴(kuò)散。在這種情況下,高斯誤差假設(shè)可能不再成立。解決這一問題的一種方法是轉(zhuǎn)變產(chǎn)出目標(biāo),以馴服規(guī)模的增長(zhǎng)。(嚴(yán)格地說,這將是目標(biāo)工程,而不是特征工程。)對(duì)數(shù)變換,這是一種功率變換,將變量的分布接近高斯。另一個(gè)解決方案是第5章討論的bin計(jì)數(shù)方法。

除了裁剪模型或培訓(xùn)過程的假設(shè), 多個(gè)功能可以組合成更復(fù)雜的功能。希望復(fù)雜的功能能夠更簡(jiǎn)潔地捕捉原始數(shù)據(jù)中的重要信息。通過使輸入功能更加 "雄辯", 模型本身可以更簡(jiǎn)單, 更容易進(jìn)行培訓(xùn)和評(píng)估, 并做出更好的預(yù)測(cè)。作為一個(gè)極端的, 復(fù)雜的特點(diǎn)本身可能是統(tǒng)計(jì)模型的輸出。這是一個(gè)稱為模型堆疊的概念, 我們將在7章和8章中更詳細(xì)地討論。在本章中, 我們給出了復(fù)雜特征的最簡(jiǎn)單示例: 交互功能。

交互特征易于制定,但特征的組合導(dǎo)致更多的輸入到模型中。為了減少計(jì)算開銷,通常需要使用自動(dòng)特征選擇來修剪輸入特征。

我們將從標(biāo)量、向量和空間的基本概念開始,然后討論尺度、分布、交互特征和特征選擇。

標(biāo)量、向量和空間

在我們開始之前, 我們需要定義一些基本概念, 這本書的其余部分。單個(gè)數(shù)字特征也稱為標(biāo)量。標(biāo)量的有序列表稱為向量。向量位于向量空間中。在絕大多數(shù)機(jī)器學(xué)習(xí)應(yīng)用中, 對(duì)模型的輸入通常表示為數(shù)字向量。本書的其余部分將討論將原始數(shù)據(jù)轉(zhuǎn)換為數(shù)字向量的最佳實(shí)踐策略.

向量可以被可視化為空間中的一個(gè)點(diǎn)。(有時(shí)人們從原點(diǎn)到那一點(diǎn)畫一條線和一個(gè)箭頭。在這本書中,我們將主要使用這一點(diǎn)。例如,假設(shè)我們有一個(gè)二維向量,。也就是說,向量包含兩個(gè)數(shù),在第一方向中,向量具有1的值,并且在第二方向中,它具有的值。我們可以在二維圖中繪制。

Figure 2-1. A single vector.

在數(shù)據(jù)世界中, 抽象向量及其特征維度具有實(shí)際意義。例如, 它可以代表一個(gè)人對(duì)歌曲的偏愛。每首歌都是一個(gè)特征, 其中1的值相當(dāng)于大拇指向上,?個(gè)拇指向下。假設(shè)向量??表示一個(gè)聽眾 Bob 的喜好。Bob喜歡 Bob Dylan 的 ?“Blowin’ in the Wind” 和 Lady Gaga 的 "Poker Face"。其他人可能有不同的喜好??偟膩碚f, 數(shù)據(jù)集合可以在特征空間中可視化為點(diǎn)云.

相反,一首歌可以由一組人的個(gè)人喜好來表示。假設(shè)只有兩個(gè)聽眾,Alice 和 Bob。Alice 喜歡 Leonard Cohen 的 “Poker Face”, “Blowin’ in the Wind” 和 “Hallelujah”,但討厭 Katy Perry 的 “Roar” 和 Radiohead 的 “Creep”。Bob 喜歡 “Roar", “Hallelujah”和“Blowin’ in the Wind”,但討厭 “Poker Face” 和 “Creep” 。在聽眾的空間里,每一首歌都是一個(gè)點(diǎn)。就像我們可以在特征空間中可視化數(shù)據(jù)一樣,我們可以在數(shù)據(jù)空間中可視化特征。圖2-2顯示了這個(gè)例子。

Figure 2-2. Illustration of feature space vs. data space.

處理計(jì)數(shù)

在大數(shù)據(jù)時(shí)代,計(jì)數(shù)可以快速積累而不受約束。用戶可以將歌曲或電影放在無限播放中,或者使用腳本反復(fù)檢查流行節(jié)目的門票可用性,這會(huì)導(dǎo)致播放次數(shù)或網(wǎng)站訪問計(jì)數(shù)迅速上升。當(dāng)數(shù)據(jù)可以以高的體積和速度產(chǎn)生時(shí),它們很可能包含一些極值。這是一個(gè)好主意,檢查他們的規(guī)模,并確定是否保持它們作為原始數(shù)字,將它們轉(zhuǎn)換成二進(jìn)制變量,以指示存在,或?qū)⑺鼈兎湃氪至6取?/p>

二值化

Million Song 數(shù)據(jù)集中的用戶品味畫像包含了一百萬個(gè)用戶在 Echo Nest 的完整音樂聆聽歷史。下面是有關(guān)數(shù)據(jù)集的一些相關(guān)統(tǒng)計(jì)數(shù)據(jù)。

Echo Nest 品味畫像數(shù)據(jù)集的統(tǒng)計(jì)

  • 有超過4800萬個(gè)用戶ID、音樂ID和監(jiān)聽計(jì)數(shù)三元組。

  • 完整的數(shù)據(jù)集包含1019318個(gè)獨(dú)特用戶和384546首獨(dú)特歌曲。

  • 引文:Echo Nest 品味畫像的數(shù)據(jù)子集,官方的 Million Song 數(shù)據(jù)集的用戶數(shù)據(jù)集,可從這里獲得:http://labrosa.ee.columbia.edu/millionsong/tasteprofile

假設(shè)任務(wù)是建立一個(gè)推薦器向用戶推薦歌曲。推薦器的一個(gè)組件可以預(yù)測(cè)用戶將對(duì)一首特別的歌曲會(huì)有多少喜歡。由于數(shù)據(jù)包含實(shí)際的聽歌次數(shù),這應(yīng)該是預(yù)測(cè)的目標(biāo)嗎?如果一個(gè)大的聽計(jì)數(shù)意味著用戶真的喜歡這首歌,反之亦然,那是正確的。然而,數(shù)據(jù)表明,雖然99%的聽計(jì)數(shù)是24或更低,也有一些聽計(jì)數(shù)數(shù)以千計(jì),最大為9667。(如圖2-3所示,直方圖最接近于0的bin中的峰值。但是超過10000個(gè)三元組的計(jì)數(shù)更大,幾千個(gè)則有幾個(gè)。這些值異常大;如果我們?cè)噲D預(yù)測(cè)實(shí)際的聽計(jì)數(shù),那么模型將被這些大的值拉離。Figure 2-3. Histogram of listen counts in the user taste profile of the Million Song Dataset. Note that the y-axis is on a log scale.

在 Million Song 數(shù)據(jù)集中,原始監(jiān)聽計(jì)數(shù)不是用戶口味的可靠度量。(在統(tǒng)計(jì)術(shù)語中,健壯性意味著該方法在各種各樣的條件下工作。)用戶有不同的聽力習(xí)慣。有些人可能把他們最喜歡的歌曲放在無限的循環(huán)中,而其他人可能只在特殊的場(chǎng)合品嘗它們。很難說聽一首歌20次的人一定喜歡聽10次的人的兩倍。

用戶偏好的更健壯表示是使計(jì)數(shù)二元化和修剪所有大于1的計(jì)數(shù)為1。換句話說,如果用戶至少聽過一首歌,那么我們將其視為用戶喜歡歌曲。這樣,模型不需要花費(fèi)周期來預(yù)測(cè)原始計(jì)數(shù)之間的微小差異。二進(jìn)制目標(biāo)是用戶偏好的簡(jiǎn)單而穩(wěn)健的度量。

例2-1:使 Million Song 數(shù)據(jù)集中聽歌計(jì)數(shù)二進(jìn)制化

import pandas as pd listen_count = pd.read_csv('data/train_triplets.txt.zip', header=None, delimiter='\t') # The table contains user-song-count triplets. Only non-zero counts are # included. Hence to binarize the count, we just need to set the entire # count column to 1. listen_count[2] = 1

這是我們?cè)O(shè)計(jì)模型目標(biāo)變量的一個(gè)例子。嚴(yán)格地說, 目標(biāo)不是一個(gè)特征, 因?yàn)樗皇禽斎?。但有時(shí)我們確實(shí)需要修改目標(biāo)以解決正確的問題。

量化或裝箱

對(duì)于本練習(xí), 我們從第 6 輪 Yelp 數(shù)據(jù)集挑戰(zhàn)中采集數(shù)據(jù), 并創(chuàng)建一個(gè)更小的分類數(shù)據(jù)集。Yelp 數(shù)據(jù)集包含用戶對(duì)來自北美和歐洲十個(gè)城市的企業(yè)的評(píng)論。每個(gè)商戶都標(biāo)記為零個(gè)或多個(gè)類別。以下是有關(guān)數(shù)據(jù)集的相關(guān)統(tǒng)計(jì)信息。

關(guān)于第 6 輪 Yelp 數(shù)據(jù)集的統(tǒng)計(jì)

  • 有782種商戶類別。

  • 完整的數(shù)據(jù)集包含 1569264 個(gè)(約1.6M)評(píng)論和 61184 個(gè)(61K)商戶。

  • “餐廳”(990627個(gè)評(píng)論)和“夜生活”(210028個(gè)評(píng)論)是最流行的類別,評(píng)論計(jì)數(shù)是明智的。

  • 沒有一個(gè)商戶同時(shí)屬于餐廳和夜生活分類。因此,這兩組評(píng)論之間沒有重疊。

每個(gè)商戶都有一個(gè)評(píng)論計(jì)數(shù)。假設(shè)我們的任務(wù)是使用協(xié)同過濾來預(yù)測(cè)用戶可能給企業(yè)的評(píng)級(jí)。評(píng)論計(jì)數(shù)可能是一個(gè)有用的輸入特征,因?yàn)橥ǔT诹餍泻土己玫脑u(píng)級(jí)之間有很強(qiáng)的相關(guān)性?,F(xiàn)在的問題是,我們應(yīng)該使用原始評(píng)論計(jì)數(shù)或進(jìn)一步處理它嗎?圖2-4顯示了所有商戶評(píng)論計(jì)數(shù)的直方圖。我們看到和音樂聽歌計(jì)數(shù)一樣的模式。大部分的統(tǒng)計(jì)數(shù)字都很小,但一些企業(yè)有成千上萬的評(píng)論。

例2-2:在YELP數(shù)據(jù)集中可視化商戶評(píng)論計(jì)數(shù)

import pandas as pd import json import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline ### Load the data about businesses biz_file = open('data/yelp_academic_dataset_business.json') biz_df = pd.DataFrame([json.loads(x) for x in biz_file.readlines()]) biz_file.close() ### Plot the histogram of the review counts sns.set_style('whitegrid') fig, ax = plt.subplots() biz_df['review_count'].hist(ax=ax, bins=100) ax.set_yscale('log') ax.tick_params(labelsize=14) ax.set_xlabel('Review Count', fontsize=14) ax.set_ylabel('Occurrence', fontsize=14) Text(0,0.5,'Occurrence') Figure 2-4. Histogram of business review counts in the Yelp reviews dataset. The y-axis is on a log-scale.

對(duì)于許多模型來說,跨越數(shù)個(gè)數(shù)量級(jí)的原始計(jì)數(shù)是有問題的。在線性模型中,相同的線性系數(shù)必須對(duì)計(jì)數(shù)的所有可能值工作。大量的計(jì)數(shù)也可能破壞無監(jiān)督學(xué)習(xí)方法,如k-均值聚類,它使用相似性函數(shù)來測(cè)量數(shù)據(jù)點(diǎn)之間的相似性。k-均值使用數(shù)據(jù)點(diǎn)之間的歐幾里得距離。數(shù)據(jù)向量的一個(gè)元素中的大計(jì)數(shù)將超過所有其他元素中的相似性,這可能會(huì)丟棄整個(gè)相似性度量。

一種解決方案是通過量化計(jì)數(shù)來包含標(biāo)量。換句話說,我們將計(jì)數(shù)分組到容器中,并且去掉實(shí)際的計(jì)數(shù)值。量化將連續(xù)數(shù)映射成離散數(shù)。我們可以把離散化的數(shù)字看作是代表強(qiáng)度度量的容器的有序的序列。

為了量化數(shù)據(jù),我們必須決定每一個(gè)箱子應(yīng)該有多寬。解決方案分為固定寬度或自適應(yīng)兩種類型。我們將給出每個(gè)類型的例子。

固定寬度裝箱

對(duì)于固定寬度裝箱, 每個(gè) bin 都包含一個(gè)特定的數(shù)值范圍。范圍可以是定制設(shè)計(jì)或自動(dòng)分割, 它們可以線性縮放或指數(shù)縮放。例如, 我們可以將一個(gè)人的年齡分組為十年: 0-9 歲歸納到bin 1, 10-19 年歸納到 bin 2 等。要從計(jì)數(shù)映射到 bin, 只需除以 bin 的寬度并取整部分。

也經(jīng)常看到定制設(shè)計(jì)的年齡范圍更適合于生活的階段:

  • 0-12 歲

  • 12-17 歲

  • 18-24 歲

  • 25-34 歲

  • 35-44 歲

  • 45-54 歲

  • 55-64 歲

  • 65-74 歲

  • 75 歲以上

當(dāng)數(shù)字跨越多個(gè)數(shù)量級(jí)時(shí),最好用10個(gè)冪(或任何常數(shù)的冪)來分組:0-9、10-99、100-999、100-9999等。容器寬度呈指數(shù)增長(zhǎng),從O(10)、O(100)到O(1000)和以上。要從計(jì)數(shù)映射到bin,取計(jì)數(shù)的log值。指數(shù)寬度的劃分與對(duì)數(shù)變換非常相關(guān),我們?cè)凇皩?duì)數(shù)變換”中討論。

例2-3:用固定寬度的箱進(jìn)行量化計(jì)數(shù)

import numpy as np ### Generate 20 random integers uniformly between 0 and 99 small_counts = np.random.randint(0, 100, 20) small_counts array([84, 45, 51, 18, 50, 78, 40, 25, 75, 17, 39, 44, 69, 53, 35, 5, 8,51, 63, 34]) np.floor_divide(small_counts, 10) array([8, 4, 5, 1, 5, 7, 4, 2, 7, 1, 3, 4, 6, 5, 3, 0, 0, 5, 6, 3],dtype=int32) ### An array of counts that span several magnitudes large_counts = [296, 8286, 64011, 80, 3, 725, 867, 2215, 7689, 11495, 91897, 44, 28, 7971,926, 122, 22222 ] ### Map to exponential-width bins via the log function np.floor(np.log10(large_counts)) array([2., 3., 4., 1., 0., 2., 2., 3., 3., 4., 4., 1., 1., 3., 2., 2., 4.])

分位數(shù)裝箱

固定寬度裝箱很容易計(jì)算。但是如果計(jì)數(shù)有很大的差距, 那么將會(huì)有許多空的垃圾箱沒有數(shù)據(jù)。該問題可以通過基于數(shù)據(jù)分布的垃圾箱自適應(yīng)定位來解決。這可以使用分發(fā)的分位數(shù)來完成。

分位數(shù)是將數(shù)據(jù)劃分為相等部分的值。例如, 中位數(shù)將數(shù)據(jù)分成一半;一半的數(shù)據(jù)是較小的, 一半大于中位數(shù)。分位數(shù)把數(shù)據(jù)分成幾個(gè)部分, 十分位數(shù)把數(shù)據(jù)劃分成十份。示例2-4 演示如何計(jì)算 Yelp 商戶評(píng)論數(shù)的十等分, 圖2-5 覆蓋直方圖上的十等分。這就更清楚地說明了對(duì)更小的計(jì)數(shù)的歪斜。

例 2-4:計(jì)算 Yelp 商戶評(píng)論數(shù)的十分位數(shù)

deciles = biz_df['review_count'].quantile([.1, .2, .3, .4, .5, .6, .7, .8, .9]) deciles 0.1 3.0 0.2 3.0 0.3 4.0 0.4 5.0 0.5 6.0 0.6 8.0 0.7 12.0 0.8 23.0 0.9 50.0 Name: review_count, dtype: float64 ### Visualize the deciles on the histogram sns.set_style('whitegrid') fig, ax = plt.subplots() biz_df['review_count'].hist(ax=ax, bins=100) for pos in deciles:handle = plt.axvline(pos, color='r') ax.legend([handle], ['deciles'], fontsize=14) ax.set_yscale('log') ax.set_xscale('log') ax.tick_params(labelsize=14) ax.set_xlabel('Review Count', fontsize=14) ax.set_ylabel('Occurrence', fontsize=14) Text(0,0.5,'Occurrence')

Figure 2-5. Deciles of the review counts in the Yelp reviews dataset. Note that both x- and y-axes are in log scale.

為了計(jì)算分位數(shù)和映射數(shù)據(jù)到分位數(shù)箱,我們可以使用 Pandas 庫(kù)。pandas.DataFrame.quantile 和 pandas.Series.quantile 用于計(jì)算分位數(shù)。pandas.qcut將數(shù)據(jù)映射到所需數(shù)量的分位數(shù)。

例2-5:按分位數(shù)分箱計(jì)數(shù)

### Continue example Example 2-3 with large_counts import pandas as pd ### Map the counts to quartiles pd.qcut(large_counts, 4, labels=False) array([1, 2, 3, 0, 0, 1, 1, 2, 2, 3, 3, 0, 0, 2, 1, 0, 3], dtype=int64) ### Compute the quantiles themselves large_counts_series = pd.Series(large_counts) large_counts_series.quantile([0.25, 0.5, 0.75]) 0.25 122.0 0.50 926.0 0.75 8286.0 dtype: float64

對(duì)數(shù)轉(zhuǎn)換

在“量化或裝箱”中,我們簡(jiǎn)要地介紹了把計(jì)數(shù)的對(duì)數(shù)映射到指數(shù)寬度箱的概念。讓我們現(xiàn)在再看一看。

對(duì)數(shù)函數(shù)是指數(shù)函數(shù)的逆。它定義為?其中??為正常數(shù),??可以是任何正數(shù)。由于,我們有。這意味著對(duì)數(shù)函數(shù)將小范圍的數(shù)字 (0、1) 映射到負(fù)數(shù)的整個(gè)范圍。函數(shù)?將?、?映射到?、、將、?映射到?、?等等。換言之, 對(duì)數(shù)函數(shù)壓縮大數(shù)的范圍, 并擴(kuò)展小數(shù)的范圍。越大的??,?的增量越慢。通過查看??函數(shù)的圖像, 可以更容易地消化這一點(diǎn)。(見圖2-6)。

Figure 2-6. The log function compresses the high numeric range and expands the low range. Note how the horizontal x values from 100 to 1000 got compressed into just 2.0 to 3.0 in the vertical y range, while the tiny horizontal portion of x values less than 100 are mapped to the rest of the vertical range.

對(duì)數(shù)變換是處理具有重尾分布的正數(shù)的有力工具。(重尾分布在尾部范圍內(nèi)的概率比高斯分布的概率大)。它將分布在高端的長(zhǎng)尾壓縮成較短的尾部,并將低端擴(kuò)展成較長(zhǎng)的頭部。圖2-7比較d對(duì)數(shù)轉(zhuǎn)換之前和之后的YELP商戶評(píng)論計(jì)數(shù)的直方圖。Y軸現(xiàn)在都在正常(線性)尺度上。在范圍內(nèi)的底部圖中增加的倉(cāng)間隔是由于在1和10之間只有10個(gè)可能的整數(shù)計(jì)數(shù)。請(qǐng)注意,原始審查計(jì)數(shù)非常集中在低計(jì)數(shù)區(qū)域,離群值在4000以上。對(duì)數(shù)變換后,直方圖不集中在低端,更分散在X軸上。

例2-6:可視化對(duì)數(shù)變換前后評(píng)論數(shù)分布

fig, (ax1, ax2) = plt.subplots(2,1) fig.tight_layout(pad=0, w_pad=4.0, h_pad=4.0) biz_df['review_count'].hist(ax=ax1, bins=100) ax1.tick_params(labelsize=14) ax1.set_xlabel('review_count', fontsize=14) ax1.set_ylabel('Occurrence', fontsize=14) biz_df['log_review_count'] = np.log(biz_df['review_count'] + 1) biz_df['log_review_count'].hist(ax=ax2, bins=100) ax2.tick_params(labelsize=14) ax2.set_xlabel('log10(review_count))', fontsize=14) ax2.set_ylabel('Occurrence', fontsize=14) Text(23.625,0.5,'Occurrence')

Figure 2-7. Comparison of Yelp business review counts before (top) and after (bottom) log transformation.

另一個(gè)例子是來自 UC Irvine 機(jī)器學(xué)習(xí)庫(kù)的在線新聞流行數(shù)據(jù)集。以下是有關(guān)數(shù)據(jù)集的相關(guān)統(tǒng)計(jì)信息。

在線新聞流行數(shù)據(jù)集的統(tǒng)計(jì)

  • 該數(shù)據(jù)集包括 MasHabor 在兩年的時(shí)間內(nèi)出版的 39797 個(gè)新聞文章的60個(gè)特征。

  • 引證: K. Fernandes, P. Vinagre 和 P. Cortez . 一種用于預(yù)測(cè)在線新聞的流行程度的主動(dòng)智能決策支持系統(tǒng)。2015 第十七屆 EPIA 活動(dòng), 葡萄牙人工智能會(huì)議論文集, 9月, 葡萄牙科英布拉。

目的是利用這些特征來預(yù)測(cè)文章在社交媒體上的用分享數(shù)量表示的流行度。在本例中, 我們將只關(guān)注一個(gè)特征——文章中的單詞數(shù)。圖2-8 顯示了對(duì)數(shù)轉(zhuǎn)換前后特征的直方圖。請(qǐng)注意, 在對(duì)數(shù)轉(zhuǎn)換后, 分布看起來更高斯, 除了長(zhǎng)度為零的文章 (無內(nèi)容) 的斷裂。

df = pd.read_csv('data/OnlineNewsPopularity.csv', delimiter=', ') df.head()

5 rows × 61 columns

df['log_n_tokens_content'] = np.log10(df['n_tokens_content'] + 1)

例2-7:可視化在有對(duì)數(shù)變換和沒有對(duì)數(shù)變換時(shí)新聞文章流行度的分布

fig, (ax1, ax2) = plt.subplots(2,1) fig.tight_layout(pad=0, w_pad=4.0, h_pad=4.0) df['n_tokens_content'].hist(ax=ax1, bins=100) ax1.tick_params(labelsize=14) ax1.set_xlabel('Number of Words in Article', fontsize=14) ax1.set_ylabel('Number of Articles', fontsize=14)df['log_n_tokens_content'].hist(ax=ax2, bins=100) ax2.tick_params(labelsize=14) ax2.set_xlabel('Log of Number of Words', fontsize=14) ax2.set_ylabel('Number of Articles', fontsize=14) Text(23.625,0.5,'Number of Articles')

Figure 2-8. Comparison of word counts in Mashable news articles before (top) and after (bottom) log transformation.

對(duì)數(shù)轉(zhuǎn)換實(shí)戰(zhàn)

讓我們看看在監(jiān)督學(xué)習(xí)中對(duì)數(shù)轉(zhuǎn)換如何執(zhí)行。我們將使用上面的兩個(gè)數(shù)據(jù)集。對(duì)于 Yelp 評(píng)論數(shù)據(jù)集, 我們將使用評(píng)論的數(shù)量來預(yù)測(cè)商戶的平均評(píng)級(jí)。對(duì)于 Mashable 的新聞文章, 我們將使用文章中的字?jǐn)?shù)來預(yù)測(cè)其流行程度。由于輸出是連續(xù)的數(shù)字, 我們將使用簡(jiǎn)單的線性回歸作為模型。我們?cè)跊]有對(duì)數(shù)變換和有對(duì)數(shù)變換的特色上,使用 Scikit Learn 執(zhí)行10折交叉驗(yàn)證的線性回歸。模型由 R 方評(píng)分來評(píng)估, 它測(cè)量訓(xùn)練后的回歸模型預(yù)測(cè)新數(shù)據(jù)的良好程度。好的模型有較高的 R 方分?jǐn)?shù)。一個(gè)完美的模型得到最高分1。分?jǐn)?shù)可以是負(fù)的, 一個(gè)壞的模型可以得到一個(gè)任意低的負(fù)評(píng)分。通過交叉驗(yàn)證, 我們不僅得到了分?jǐn)?shù)的估計(jì), 還獲得了方差, 這有助于我們判斷兩種模型之間的差異是否有意義。

例2-8:使用對(duì)數(shù)轉(zhuǎn)換 YELP 評(píng)論數(shù)預(yù)測(cè)平均商戶評(píng)級(jí)

import pandas as pd import numpy as np import json from sklearn import linear_model from sklearn.model_selection import cross_val_score ## Using the previously loaded Yelp reviews dataframe, ## compute the log transform of the Yelp review count. ## Note that we add 1 to the raw count to prevent the logarithm from ## exploding into negative infinity in case the count is zero. biz_df['log_review_count'] = np.log10(biz_df['review_count'] + 1) biz_df.head()
business_idcategoriescityfull_addresslatitudelongitudenameneighborhoodsopenreview_countstarsstatetypelog_review_count01234
rncjoVoEFUJGCUoC1JgnUA[Accountants, Professional Services, Tax Servi...Peoria8466 W Peoria Ave\nSte 6\nPeoria, AZ 8534533.581867-112.241596Peoria Income Tax Service[]True35.0AZbusiness0.602060
0FNFSzCFP_rGUoJx8W7tJg[Sporting Goods, Bikes, Shopping]Phoenix2149 W Wood Dr\nPhoenix, AZ 8502933.604054-112.105933Bike Doctor[]True55.0AZbusiness0.778151
3f_lyB6vFK48ukH6ScvLHg[]Phoenix1134 N Central Ave\nPhoenix, AZ 8500433.460526-112.073933Valley Permaculture Alliance[]True45.0AZbusiness0.698970
usAsSV36QmUej8--yvN-dg[Food, Grocery]Phoenix845 W Southern Ave\nPhoenix, AZ 8504133.392210-112.085377Food City[]True53.5AZbusiness0.778151
PzOqRohWw7F7YEPBz6AubA[Food, Bagels, Delis, Restaurants]Glendale Az6520 W Happy Valley Rd\nSte 101\nGlendale Az, ...33.712797-112.200264Hot Bagels & Deli[]True143.5AZbusiness1.176091
## Train linear regression models to predict the average stars rating of a business, ## using the review_count feature with and without log transformation ## Compare the 10-fold cross validation score of the two models m_orig = linear_model.LinearRegression() scores_orig = cross_val_score(m_orig, biz_df[['review_count']], biz_df['stars'], cv=10) m_log = linear_model.LinearRegression() scores_log = cross_val_score(m_log, biz_df[['log_review_count']], biz_df['stars'], cv=10) print("R-squared score without log transform: %0.5f (+/- %0.5f)" %(scores_orig.mean(), scores_orig.std() * 2)) print("R-squared score with log transform: %0.5f (+/- %0.5f)" %(scores_log.mean(), scores_log.std() * 2)) R-squared score without log transform: 0.00215 (+/- 0.00329) R-squared score with log transform: 0.00136 (+/- 0.00328)

從實(shí)驗(yàn)的結(jié)果來看, 兩個(gè)簡(jiǎn)單的模型 (有對(duì)數(shù)變換和沒有對(duì)數(shù)變換) 在預(yù)測(cè)目標(biāo)時(shí)同樣不好, 而有對(duì)數(shù)變換的特征表現(xiàn)略差。真令人失望!這并不奇怪, 他們都不是很好, 因?yàn)樗麄兌贾皇褂靡粋€(gè)功能。但是, 人們本來希望日志轉(zhuǎn)換的功能執(zhí)行得更好。

讓我們看看對(duì)數(shù)轉(zhuǎn)換在線新聞流行數(shù)據(jù)集上如何表現(xiàn)。

例2-9:利用經(jīng)過對(duì)數(shù)轉(zhuǎn)換在線新聞數(shù)據(jù)中的詞數(shù)量預(yù)測(cè)文章流行度

## Download the Online News Popularirty dataset from UCI, then use ## Pandas to load the file into a dataframe## Take the log transform of the 'n_tokens_content' feature, which ## represents the number of words (tokens) in a news article. df['log_n_tokens_content'] = np.log10(df['n_tokens_content'] + 1)## Train two linear regression models to predict the number of shares ## of an article, one using the original feature and the other the ## log transformed version. m_orig = linear_model.LinearRegression() scores_orig = cross_val_score(m_orig, df[['n_tokens_content']], df['shares'], cv=10) m_log = linear_model.LinearRegression() scores_log = cross_val_score(m_log, df[['log_n_tokens_content']], df['shares'], cv=10) print("R-squared score without log transform: %0.5f (+/- %0.5f)" %(scores_orig.mean(), scores_orig.std() * 2)) print("R-squared score with log transform: %0.5f (+/- %0.5f)" %(scores_log.mean(), scores_log.std() * 2)) R-squared score without log transform: -0.00242 (+/- 0.00509) R-squared score with log transform: -0.00114 (+/- 0.00418)

置信區(qū)間仍然重疊,但具有對(duì)數(shù)變換特征的模型比沒有對(duì)數(shù)變換的表現(xiàn)更好。為什么對(duì)數(shù)轉(zhuǎn)換在這個(gè)數(shù)據(jù)集上更成功?我們可以通過觀察輸入特征和目標(biāo)值的散點(diǎn)圖來得到線索。如圖2-9的底部面板所示,對(duì)數(shù)變換重塑了軸,將目標(biāo)值(大于200000個(gè)份額)中的大離群值進(jìn)一步拉向軸的右手側(cè)。這給線性模型在輸入特征空間的低端更多的“呼吸空間”。沒有對(duì)數(shù)轉(zhuǎn)換(上部面板),在輸入值變化下非常小的情況下,模型有更大的壓力下適應(yīng)非常不同的目標(biāo)值。

例2-10:可視化新聞流程度預(yù)測(cè)問題中輸入輸出相關(guān)性

fig2, (ax1, ax2) = plt.subplots(2, 1,figsize=(10, 4)) fig.tight_layout(pad=0.4, w_pad=4.0, h_pad=6.0) ax1.scatter(df['n_tokens_content'], df['shares']) ax1.tick_params(labelsize=14) ax1.set_xlabel('Number of Words in Article', fontsize=14) ax1.set_ylabel('Number of Shares', fontsize=14)ax2.scatter(df['log_n_tokens_content'], df['shares']) ax2.tick_params(labelsize=14) ax2.set_xlabel('Log of the Number of Words in Article', fontsize=14) ax2.set_ylabel('Number of Shares', fontsize=14) Text(0,0.5,'Number of Shares')

Figure 2-9. Scatter plot of number of words (input) vs. number of shares (target) in the Online News dataset. The top plot visualizes the original feature, and the bottom plot shows the scatter plot after log transformation.

將此與應(yīng)用于YELP評(píng)論數(shù)據(jù)集的相同散點(diǎn)圖進(jìn)行比較。圖2-10看起來與圖2-9非常不同。在1到5,步長(zhǎng)0.5的區(qū)間,平均星級(jí)是離散的。高評(píng)論計(jì)數(shù)(大致>2500評(píng)論)與較高的平均星級(jí)評(píng)級(jí)相關(guān)。但這種關(guān)系遠(yuǎn)不是線性的。沒有一種清晰的方法可以根據(jù)輸入來預(yù)測(cè)平均星級(jí)。從本質(zhì)上講,該圖表明,評(píng)論數(shù)及其對(duì)數(shù)都是平均星級(jí)的不良線性預(yù)測(cè)因子。

### 例2-11??梢暬?Yelp 商戶評(píng)論預(yù)測(cè)中輸入與輸出的相關(guān)性。 fig, (ax1, ax2) = plt.subplots(2,1) fig.tight_layout(pad=0, w_pad=4.0, h_pad=4.0) ax1.scatter(biz_df['review_count'], biz_df['stars']) ax1.tick_params(labelsize=14) ax1.set_xlabel('Review Count', fontsize=14) ax1.set_ylabel('Average Star Rating', fontsize=14)ax2.scatter(biz_df['log_review_count'], biz_df['stars']) ax2.tick_params(labelsize=14) ax2.set_xlabel('Log of Review Count', fontsize=14) ax2.set_ylabel('Average Star Rating', fontsize=14) Text(23.625,0.5,'Average Star Rating')

Figure 2-10. Scatter plot of review counts (input) vs. average star ratings (target) in the Yelp Reviews dataset. The top panel plots the original review count, and the bottom panel plots the review count after log transformation.

數(shù)據(jù)可視化的重要性

對(duì)數(shù)變換在兩個(gè)不同數(shù)據(jù)集上的影響的比較,說明了可視化數(shù)據(jù)的重要性。在這里,我們故意保持輸入和目標(biāo)變量簡(jiǎn)單,以便我們可以很容易地可視化它們之間的關(guān)系。如圖2-10所示的曲線,立即顯示所選擇的模型(線性)不可能代表所選擇的輸入和目標(biāo)之間的關(guān)系。另一方面,人們可以令人信服地在給定平均星級(jí)模擬評(píng)論數(shù)的分布。在建立模型時(shí),最好直觀地檢查輸入和輸出之間的關(guān)系,以及不同輸入特征之間的關(guān)系。

功率變換:對(duì)數(shù)變換的推廣

對(duì)數(shù)變換是一個(gè)稱為功率變換的變換族的特殊例子。在統(tǒng)計(jì)方面,這些是方差穩(wěn)定的變換。為了理解為什么方差穩(wěn)定是好的,考慮泊松分布。這是一個(gè)方差等于它的平均值的重尾分布。因此,它的質(zhì)量中心越大,其方差越大,尾部越重。功率變換改變變量的分布,使得方差不再依賴于平均值。例如,假設(shè)一個(gè)隨機(jī)變量X具有泊松分布。假如我們使用開平方根變換,?的方差大致是恒定的, 而不是等于平均值。

Figure 2-11. A rough illustration of the Poisson distribution. λ represents the mean of the distribution. As λ increases, not only does the mode of of the distribution shift to the right, but the mass spreads out and the variance becomes larger. The Poisson distribution is an example distribution where the variance increases along with the mean.

平方根變換和對(duì)數(shù)變換的簡(jiǎn)單推廣稱為Box-Cox變換:

圖2-12, 展示出了在 ?(log變換),,(平方根的縮放和移位版本),, 和時(shí)的Box-Cox變換。設(shè)置?小于1時(shí)壓縮較高的值,并且設(shè)置大于1時(shí)具有相反的效果。

Figure 2-12. Box-Cox transforms for different values of?.

只有當(dāng)數(shù)據(jù)為正值時(shí), Box-Cox 公式才能工作。對(duì)于非正數(shù)據(jù), 可以通過加上固定常量來移動(dòng)數(shù)值。當(dāng)應(yīng)用 Box-Cox 變換或更一般的功率變換時(shí), 我們必須確定參數(shù)??的值。這可能是通過最大似然(找到的,使產(chǎn)生的變換信號(hào)的高斯似然最大) 或貝葉斯方法。完全介紹 Box-Cox 和一般功率變換的使用超出了本書的范圍。感興趣的讀者可以通過 Jack Johnston 和John DiNardo (McGraw Hill) 編寫的Econometric Methods 找到更多關(guān)于冪轉(zhuǎn)換的信息。幸運(yùn)的是, Scipy 的數(shù)據(jù)包包含了一個(gè) Box-Cox 轉(zhuǎn)換的實(shí)現(xiàn), 其中包括查找最佳變換參數(shù)。

例2-12:Yelp商戶評(píng)論數(shù)的 Box-Cox 變換

from scipy import stats# Continuing from the previous example, assume biz_df contains # the Yelp business reviews data # Box-Cox transform assumes that input data is positive. # Check the min to make sure. biz_df['review_count'].min() 3 biz_df.columns Index(['business_id', 'categories', 'city', 'full_address', 'latitude','longitude', 'name', 'neighborhoods', 'open', 'review_count', 'stars','state', 'type', 'log_review_count'],dtype='object') # Setting input parameter lmbda to 0 gives us the log transform (without constant offset) rc_log = stats.boxcox(biz_df['review_count'], lmbda=0) biz_df['rc_log']=rc_log # By default, the scipy implementation of Box-Cox transform finds the lmbda parameter # that will make the output the closest to a normal distribution rc_bc, bc_params = stats.boxcox(biz_df['review_count']) bc_params -0.5631160899391674 biz_df['rc_bc']=rc_bc

圖2-13 提供了原始和轉(zhuǎn)換評(píng)論數(shù)分布的可視化比較。

### 例2-13。可視化評(píng)論數(shù)的原始、對(duì)數(shù)轉(zhuǎn)換和 Box-Cox 轉(zhuǎn)換的直方圖。fig, (ax1, ax2, ax3) = plt.subplots(3, 1) fig.tight_layout(pad=0, w_pad=4.0, h_pad=4.0) # original review count histogram biz_df['review_count'].hist(ax=ax1, bins=100) ax1.set_yscale('log') ax1.tick_params(labelsize=14) ax1.set_title('Review Counts Histogram', fontsize=14) ax1.set_xlabel('') ax1.set_ylabel('Occurrence', fontsize=14)# review count after log transform biz_df['rc_log'].hist(ax=ax2, bins=100) ax2.set_yscale('log') ax2.tick_params(labelsize=14) ax2.set_title('Log Transformed Counts Histogram', fontsize=14) ax2.set_xlabel('') ax2.set_ylabel('Occurrence', fontsize=14)# review count after optimal Box-Cox transform biz_df['rc_bc'].hist(ax=ax3, bins=100) ax3.set_yscale('log') ax3.tick_params(labelsize=14) ax3.set_title('Box-Cox Transformed Counts Histogram', fontsize=14) ax3.set_xlabel('') ax3.set_ylabel('Occurrence', fontsize=14) Text(29.125,0.5,'Occurrence')

Figure 2-13. Box-Cox transformation of Yelp business review counts.

概率圖是一種直觀地比較數(shù)據(jù)分布與理論分布的簡(jiǎn)單方法。這本質(zhì)上是觀察到散點(diǎn)圖的與理論分位數(shù)。圖2-14顯示YELP評(píng)論數(shù)的原始數(shù)據(jù)和轉(zhuǎn)換后數(shù)據(jù)相對(duì)正態(tài)分布的概率圖。由于觀測(cè)數(shù)據(jù)是嚴(yán)格正的,高斯可以是負(fù)的,所以分位數(shù)在負(fù)端上永遠(yuǎn)不會(huì)匹配。所以我們關(guān)注的是正數(shù)這的一邊。在這方面,原始評(píng)論數(shù)明顯比正常分布更重尾。(有序值上升到4000,而理論位數(shù)僅延伸到4)。簡(jiǎn)單的對(duì)數(shù)變換和最優(yōu)的 Box-Cox 變換都使正尾部接近正態(tài)分布。最優(yōu)的 Box-Cox 變換比對(duì)數(shù)變換更縮小尾部,由于尾部在紅色對(duì)角線等值線下平展可以明顯看出。

例 2-14:原始和變換后的數(shù)據(jù)相對(duì)正態(tài)分布的概率圖

fig2, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(8, 6)) # fig.tight_layout(pad=4, w_pad=5.0, h_pad=0.0) prob1 = stats.probplot(biz_df['review_count'], dist=stats.norm, plot=ax1) ax1.set_xlabel('') ax1.set_title('Probplot against normal distribution') prob2 = stats.probplot(biz_df['rc_log'], dist=stats.norm, plot=ax2) ax2.set_xlabel('') ax2.set_title('Probplot after log transform') prob3 = stats.probplot(biz_df['rc_bc'], dist=stats.norm, plot=ax3) ax3.set_xlabel('Theoretical quantiles') ax3.set_title('Probplot after Box-Cox transform')Text(0.5,1,'Probplot after Box-Cox transform')

Figure 2-14. Comparing the distribution of raw and transformed review counts against the Normal distribution.

特征縮放或歸一化

某些特征的值有界的,如緯度或經(jīng)度。其他數(shù)值特征 (如數(shù)量) 可能會(huì)在無界的情況下增加。那些關(guān)于輸入是平滑函數(shù)的模型, 如線性回歸、邏輯回歸或任何涉及矩陣的東西, 都受輸入的數(shù)值范圍影響。另一方面, 基于樹的模型不太在意這個(gè)。如果你的模型對(duì)輸入特征的數(shù)值范圍敏感, 則特征縮放可能會(huì)有所幫助。顧名思義, 特征縮放會(huì)更改特征值的數(shù)值范圍。有時(shí)人們也稱它為特征規(guī)范化。功能縮放通常分別針對(duì)單個(gè)特征進(jìn)行。有幾種常見的縮放操作, 每個(gè)類型都產(chǎn)生不同的特征值分布。

Min-max縮放

設(shè)是一個(gè)單獨(dú)的特征值(即,在某些數(shù)據(jù)點(diǎn)中的一個(gè)特征值),以及??和??,分別是整個(gè)數(shù)據(jù)集上該特征的最小值和最大值。Min-max縮放壓縮(或拉伸)所有特征值到的范圍內(nèi)。圖2-15演示了這個(gè)概念。最小最大尺度的公式是

Figure 2-15. Min-max scaling

標(biāo)準(zhǔn)化(方差縮放)

特征標(biāo)準(zhǔn)化的定義為:

減去特征 (所有數(shù)據(jù)點(diǎn)) 的平均值并除以方差。因此, 它也可以稱為方差縮放??s放后的特征的平均值為0, 方差為1。如果原始特征具有高斯分布, 則縮放特征為標(biāo)準(zhǔn)高斯。圖2-16 包含了標(biāo)準(zhǔn)化的說明。Figure 2-16. Illustration of feature standardization

不要中心化稀疏數(shù)據(jù)

最小最大縮放和標(biāo)準(zhǔn)化都從原始特征值中減去一個(gè)數(shù)量。對(duì)于最小最大縮放, 移動(dòng)量是當(dāng)前特征的所有值中最小的。對(duì)于標(biāo)準(zhǔn)化, 移動(dòng)的量是平均值。如果移動(dòng)量不是零, 則這兩種轉(zhuǎn)換可以將稀疏特征(大部分值為零)的向量轉(zhuǎn)換為一個(gè)稠密的向量。這反過來會(huì)給分類器帶來巨大的計(jì)算負(fù)擔(dān), 取決于它是如何實(shí)現(xiàn)的。詞袋是一種稀疏表示, 大多數(shù)分類庫(kù)都對(duì)稀疏輸入進(jìn)行優(yōu)化。如果現(xiàn)在的表示形式包含了文檔中沒有出現(xiàn)的每個(gè)單詞, 那就太可怕了。請(qǐng)謹(jǐn)慎對(duì)稀疏特征執(zhí)行最小最大縮放和標(biāo)準(zhǔn)化操作。

L2 normalization

這項(xiàng)技術(shù)通過所謂的 L2 范數(shù) (也稱為歐幾里德范數(shù)) 正常化 (劃分) 原始特征值。

L2范數(shù)度量向量在坐標(biāo)空間中的長(zhǎng)度。這個(gè)定義可以從眾所周知的勾股定理中得到,給出三角形兩邊的長(zhǎng)度,可以得到斜邊長(zhǎng)度。

L2 范數(shù)將求特征的各數(shù)據(jù)點(diǎn)的平方和, 然后取平方根。L2 規(guī)范化后, 該特征列具有范數(shù)1。它也可以稱為 L2 縮放。(不嚴(yán)謹(jǐn)?shù)恼f, 縮放意味著和常量相乘, 而規(guī)范化可能涉及許多操作。)圖2-17說明了 L2 規(guī)范化。Figure 2-17. Illustration of L2 feature normalization

數(shù)據(jù)空間與特征空間

請(qǐng)注意,圖2-17中的說明是在數(shù)據(jù)空間中,而不是特征空間。還可以對(duì)數(shù)據(jù)點(diǎn)進(jìn)行L2歸一化,而不是特征,這將導(dǎo)致具有單位范數(shù)(范數(shù)為1)的數(shù)據(jù)向量。(參見詞袋中關(guān)于數(shù)據(jù)向量和特征向量的互補(bǔ)性質(zhì)的討論)不管縮放方法如何,特征縮放總是將特征除以常數(shù)(也稱為歸一化常數(shù))。因此,它不會(huì)改變單特征分布的形狀。我們將用在線新聞文章標(biāo)記計(jì)數(shù)來說明這一點(diǎn)。

例2-15:特征縮放示例。

import pandas as pd import sklearn.preprocessing as preproc# Load the online news popularity dataset df = pd.read_csv('data/OnlineNewsPopularity.csv', delimiter=', ')# Look at the original data - the number of words in an article df['n_tokens_content'].as_matrix() array([219., 255., 211., ..., 442., 682., 157.]) # Min-max scaling df['minmax'] = preproc.minmax_scale(df[['n_tokens_content']]) df['minmax'].as_matrix() array([0.02584376, 0.03009205, 0.02489969, ..., 0.05215955, 0.08048147,0.01852726]) # Standardization - note that by definition, some outputs will be negative df['standardized'] = preproc.StandardScaler().fit_transform(df[['n_tokens_content']]) df['standardized'].as_matrix() array([-0.69521045, -0.61879381, -0.71219192, ..., -0.2218518 ,0.28759248, -0.82681689]) # L2-normalization df['l2_normalized'] = preproc.normalize(df[['n_tokens_content']], axis=0) df['l2_normalized'].as_matrix() array([0.00152439, 0.00177498, 0.00146871, ..., 0.00307663, 0.0047472 ,0.00109283])

我們也可以可視化用不同的特征縮放方法后的數(shù)據(jù)的分布。如圖2-18所示,與對(duì)數(shù)變換不同,特征縮放不會(huì)改變分布的形狀;只有數(shù)據(jù)的規(guī)模發(fā)生變化。

例2-16:繪制原始數(shù)據(jù)和縮放數(shù)據(jù)的直方圖。

fig, (ax1, ax2, ax3, ax4) = plt.subplots(4,1) fig.tight_layout(pad=0, w_pad=1.0, h_pad=2.0) # fig.tight_layout()df['n_tokens_content'].hist(ax=ax1, bins=100) ax1.tick_params(labelsize=14) ax1.set_xlabel('Article word count', fontsize=14) # ax1.set_ylabel('Number of articles', fontsize=14)df['minmax'].hist(ax=ax2, bins=100) ax2.tick_params(labelsize=14) ax2.set_xlabel('Min-max scaled word count', fontsize=14) ax2.set_ylabel('Number of articles', fontsize=14)df['standardized'].hist(ax=ax3, bins=100) ax3.tick_params(labelsize=14) ax3.set_xlabel('Standardized word count', fontsize=14) # ax3.set_ylabel('Number of articles', fontsize=14)df['l2_normalized'].hist(ax=ax4, bins=100) ax4.tick_params(labelsize=14) ax4.set_xlabel('L2-normalized word count', fontsize=14) ax4.set_ylabel('Number of articles', fontsize=14) Text(29.125,0.5,'Number of articles')

Figure 2-18. Original and scaled news article word counts. Note that only the scale of the x-axis changes; the shape of the distribution stays the same with feature scaling.

在一組輸入特征在比例上差異很大的情況下,特征縮放非常有用。例如,一個(gè)流行的電子商務(wù)網(wǎng)站的每日訪問者數(shù)量可能是十萬,而實(shí)際銷售額可能是幾千。如果這兩種功能都投入到模型中,那么該模型需要在確定要做什么的同時(shí)平衡它們的規(guī)模。輸入特征的極大變化會(huì)導(dǎo)致模型訓(xùn)練算法的數(shù)值穩(wěn)定性問題。在這些情況下,標(biāo)準(zhǔn)化功能是個(gè)好主意。第4章將詳細(xì)介紹處理自然文本時(shí)的特征縮放,包括使用示例。

交互特征

簡(jiǎn)單的成對(duì)交互特征是兩個(gè)特征的積。類似邏輯與。它以成對(duì)條件表示結(jié)果:“購(gòu)買來自郵政編碼98121”和“用戶的年齡在18到35之間”。這一點(diǎn)對(duì)基于決策樹的模型沒有影響,但發(fā)交互特征對(duì)廣義線性模型通常很有幫助。

一個(gè)簡(jiǎn)單的線性模型使用單個(gè)輸入特征線性組合,,...?來預(yù)測(cè)結(jié)果

一個(gè)簡(jiǎn)單的擴(kuò)展線性模型的方法是包含輸入特征對(duì)的組合,如下所示:

這使我們能夠捕獲特征之間的相互影響,因此它們被稱為交互特征。如果和是二元的,那么它們的積??是邏輯函數(shù)??假設(shè)問題是根據(jù)他或她的個(gè)人資料信息預(yù)測(cè)客戶的偏好。在這種情況下,交互特征不是僅基于用戶的年齡或位置進(jìn)行預(yù)測(cè),而交互特征允許模型基于具有特定年齡和特定位置的用戶進(jìn)行預(yù)測(cè)。

在例2-17中,我們使用 UCI 在線新聞數(shù)據(jù)集中的成對(duì)交互特征來預(yù)測(cè)每篇新聞文章的分享數(shù)量。交互特征導(dǎo)致精度超過單身特征。兩者都比例2-9表現(xiàn)得更好,它使用文章正文中單詞數(shù)的單個(gè)預(yù)測(cè)器(有或沒有經(jīng)過對(duì)數(shù)變換)。

例 2-17:用于預(yù)測(cè)的交互特征示例

from sklearn import linear_model from sklearn.model_selection import train_test_split import sklearn.preprocessing as preproc### Assume df is a Pandas dataframe containing the UCI online news dataset df.columns Index(['url', 'timedelta', 'n_tokens_title', 'n_tokens_content','n_unique_tokens', 'n_non_stop_words', 'n_non_stop_unique_tokens','num_hrefs', 'num_self_hrefs', 'num_imgs', 'num_videos','average_token_length', 'num_keywords', 'data_channel_is_lifestyle','data_channel_is_entertainment', 'data_channel_is_bus','data_channel_is_socmed', 'data_channel_is_tech','data_channel_is_world', 'kw_min_min', 'kw_max_min', 'kw_avg_min','kw_min_max', 'kw_max_max', 'kw_avg_max', 'kw_min_avg', 'kw_max_avg','kw_avg_avg', 'self_reference_min_shares', 'self_reference_max_shares','self_reference_avg_sharess', 'weekday_is_monday', 'weekday_is_tuesday','weekday_is_wednesday', 'weekday_is_thursday', 'weekday_is_friday','weekday_is_saturday', 'weekday_is_sunday', 'is_weekend', 'LDA_00','LDA_01', 'LDA_02', 'LDA_03', 'LDA_04', 'global_subjectivity','global_sentiment_polarity', 'global_rate_positive_words','global_rate_negative_words', 'rate_positive_words','rate_negative_words', 'avg_positive_polarity', 'min_positive_polarity','max_positive_polarity', 'avg_negative_polarity','min_negative_polarity', 'max_negative_polarity', 'title_subjectivity','title_sentiment_polarity', 'abs_title_subjectivity','abs_title_sentiment_polarity', 'shares', 'minmax', 'standardized','l2_normalized'],dtype='object') ### Select the content-based features as singleton features in the model, ### skipping over the derived features features = ['n_tokens_title', 'n_tokens_content','n_unique_tokens', 'n_non_stop_words', 'n_non_stop_unique_tokens','num_hrefs', 'num_self_hrefs', 'num_imgs', 'num_videos','average_token_length', 'num_keywords', 'data_channel_is_lifestyle','data_channel_is_entertainment', 'data_channel_is_bus','data_channel_is_socmed', 'data_channel_is_tech','data_channel_is_world']X = df[features] y = df[['shares']] ### Create pairwise interaction features, skipping the constant bias term X2 = preproc.PolynomialFeatures(include_bias=False).fit_transform(X) X2.shape (39644, 170) ### Create train/test sets for both feature sets X1_train, X1_test, X2_train, X2_test, y_train, y_test = train_test_split(X, X2, y, test_size=0.3, random_state=123)def evaluate_feature(X_train, X_test, y_train, y_test): # Fit a linear regression model on the training set and score on the test setmodel = linear_model.LinearRegression().fit(X_train, y_train)r_score = model.score(X_test, y_test)return (model, r_score) ### Train models and compare score on the two feature sets (m1, r1) = evaluate_feature(X1_train, X1_test, y_train, y_test) (m2, r2) = evaluate_feature(X2_train, X2_test, y_train, y_test) print("R-squared score with singleton features: %0.5f" % r1) print("R-squared score with pairwise features: %0.10f" % r2) R-squared score with singleton features: 0.00924 R-squared score with pairwise features: 0.0113280910

構(gòu)造交互特征非常簡(jiǎn)單,但它們使用起來很昂貴。使用成對(duì)交互特征的線性模型的訓(xùn)練和得分時(shí)間將從到,其中是單身特征的數(shù)量。

圍繞高階交互特征的計(jì)算成本有幾種方法。可以在所有交互特征之上執(zhí)行特征選擇,選擇前幾個(gè)?;蛘?#xff0c;可以更仔細(xì)地制作更少數(shù)量的復(fù)雜特征。兩種策略都有其優(yōu)點(diǎn)和缺點(diǎn)。特征選擇采用計(jì)算手段來選擇問題的最佳特征。(這種技術(shù)不限于交互特征。)一些特征選擇技術(shù)仍然需要訓(xùn)練多個(gè)具有大量特征的模型。

手工制作的復(fù)雜特征可以具有足夠的表現(xiàn)力,所以只需要少量這些特征,這可以縮短模型的訓(xùn)練時(shí)間。但是特征本身的計(jì)算可能很昂貴,這增加了模型評(píng)分階段的計(jì)算成本。手工制作(或機(jī)器學(xué)習(xí))的復(fù)雜特征的好例子可以在第8章有關(guān)圖像特征中找到?,F(xiàn)在讓我們看看一些特征選擇技巧。

特征選擇

特征選擇技術(shù)會(huì)刪除非有用的特征,以降低最終模型的復(fù)雜性。最終目標(biāo)是快速計(jì)算的簡(jiǎn)約模型,預(yù)測(cè)準(zhǔn)確性降低很小或不會(huì)降低。為了得到這樣的模型,一些特征選擇技術(shù)需要訓(xùn)練多個(gè)候選模型。換句話說,特征選擇并不是減少訓(xùn)練時(shí)間,實(shí)際上有些技巧增加了整體訓(xùn)練時(shí)間,但是減少了模型評(píng)分時(shí)間。

粗略地說,特征選擇技術(shù)分為三類。

  • Filtering(過濾): 預(yù)處理可以刪除那些不太可能對(duì)模型有用的特征。例如,可以計(jì)算每個(gè)特征與響應(yīng)變量之間的相關(guān)或相互信息,并篩除相關(guān)信息或相互信息低于閾值的特征。第3章討論了文本特征的過濾技術(shù)的例子。過濾比下面的包裝(wrapper)技術(shù)便宜得多,但是他們沒有考慮到正在使用的模型。因此他們可能無法為模型選擇正確的特征。最好先保守地進(jìn)行預(yù)過濾,以免在進(jìn)行模型訓(xùn)練步驟之前無意中消除有用的特征。

  • Wrapper methods(包裝方法):這些技術(shù)是昂貴的,但它們?cè)试S您嘗試特征子集,這意味著你不會(huì)意外刪除自身無法提供信息但在組合使用時(shí)非常有用的特征。包裝方法將模型視為提供特征子集質(zhì)量分?jǐn)?shù)的黑盒子。shi一個(gè)獨(dú)立的方法迭代地改進(jìn)子集。

  • Embedded methods(嵌入式方法):嵌入式方法執(zhí)行特征選擇作為模型訓(xùn)練過程的一部分。例如,決策樹固有地執(zhí)行特征選擇,因?yàn)樗诿總€(gè)訓(xùn)練步驟選擇一個(gè)要在其上進(jìn)行樹分裂的特征。另一個(gè)例子是正則,它可以添加到任何線性模型的訓(xùn)練目標(biāo)中。鼓勵(lì)模型使用一些特征而不是許多特征。因此它也被稱為模型的稀疏約束。嵌入式方法將特征選擇作為模型訓(xùn)練過程的一部分。它們不如包裝方法那么強(qiáng)大,但也遠(yuǎn)不如包裝方法那么昂貴。與過濾相比,嵌入式方法會(huì)選擇特定于模型的特征。從這個(gè)意義上講,嵌入式方法在計(jì)算費(fèi)用和結(jié)果質(zhì)量之間取得平衡。

特征選擇的全面處理超出了本書的范圍。有興趣的讀者可以參考 Isabelle Guyon 和 André Elisseeff 撰寫的調(diào)查報(bào)告“變量和特征選擇介紹”(“An Introduction to Variable and Feature Selection”)。

總結(jié)

本文討論了許多常見的數(shù)字特征工程技術(shù):量化,縮放(又稱規(guī)范化),對(duì)數(shù)變換(一種功率變換),交互特征以及處理大量交互特征所需的特征選擇技術(shù)的簡(jiǎn)要總結(jié)。在統(tǒng)計(jì)機(jī)器學(xué)習(xí)中,所有數(shù)據(jù)最終歸結(jié)為數(shù)字特征。因此,所有道路最終都會(huì)指向某種數(shù)字特征工程技術(shù)。為了結(jié)束特征工程這個(gè)游戲,保證這些工具方便使用!

參考書目

Guyon, Isabell, and André Elisseeff. 2003. Journal of Machine Learning Research Special Issue on Variable and Feature Selection. 3(Mar):1157--1182.

Johnston, Jack, and John DiNardo. 1997. Econometric Methods (Fourth Edition). New York: McGraw Hill.

相關(guān)資源

原版(英文)圖書地址:

https://www.oreilly.com/library/view/feature-engineering-for/9781491953235/

本文代碼可以在github下載:

https://github.com/fengdu78/Data-Science-Notes/tree/master/9.feature-engineering

數(shù)據(jù)集的百度云:

鏈接:https://pan.baidu.com/s/1uDXt5jWUOfI0fS7hD91vBQ?提取碼:8p5d

往期精彩回顧 那些年做的學(xué)術(shù)公益-你不是一個(gè)人在戰(zhàn)斗適合初學(xué)者入門人工智能的路線及資料下載機(jī)器學(xué)習(xí)在線手冊(cè)深度學(xué)習(xí)在線手冊(cè)備注:加入本站微信群或者qq群,請(qǐng)回復(fù)“加群”加入知識(shí)星球(4500+用戶,ID:92416895),請(qǐng)回復(fù)“知識(shí)星球”

總結(jié)

以上是生活随笔為你收集整理的AI基础:特征工程-数字特征处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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