创建自己的特征和转换器
創建新特征的數據
有時候,僅僅選擇已有特征是不夠的。我們需要在已有特征基礎上創建新的特征。
一個效果好的新創建的特征,可以很有效的降低冗余信息,提高特征之間的相關性。對于算法準確率的提高有很好的促進作用。
接下來,加載一個新的數據集,從http://archive.ics.uci.edu/ml/datasets/Internet+Advertisements下載Advertisements(廣告)數據集。保存到自己主目錄下的Data文件夾中。下載ad.data和ad.names
接著,用pandas加載數據集。我們還是先指定文件的路徑。
import os import pandas as pd import numpy as np data_folder = os.path.join(os.path.expanduser("~"), "Data") data_filename = os.path.join(data_folder, "Ads", "ad.data")數據集存在幾個問題,加載過程需要我們做些處理。問題一,前幾個特征是數值,但是pandas 會把它們當成字符串。要修復這個問題,我們需要編寫將字符串轉換為數字的函數,該函數能夠 把只包含數字的字符串轉換為數字,把其余的轉化為“NaN” (“Not a Number”,不是一個數字), 表示參數值無法轉換為數字。
問題二,數據集中有些值缺失,缺失的值用“?”表示。幸運的是,問號不會被轉換為浮點型數據,因此,我們也可以把它們轉換為“NaN”。
下面定義函數來解決這兩個問題,首先使用try/except結構,捕獲ValueError異常(字符串無法轉換為數字時,拋出異常)。 如果轉換失敗,返回numpy庫中的“NaN”類型。
def convert_number(x):try:return float(x)except ValueError:return np.nan創建一個字典存儲所有特征及其轉換結果,想把所有的特征值轉換為浮點型。 把后一列(編號為#1558)的值轉化為0或1,該列表示每條數據的類別。在Adult數據集中,我們專門創建了一列表示類別。對于當前實驗,導入數據時,順便把類別這一列各個類別值由字符串轉換為數值。也就是對于是廣告還是不是廣告,我們希望用0和1來表示。1表示是廣告,0表示不是廣告。
from collections import defaultdict converters = defaultdict(convert_number) #{i: convert_number for i in range(1558)} converters[1558] = lambda x: 1 if x.strip() == "ad." else 0可以用read_csv加載數據集了,在參數中指定我們剛創建的轉換函數。
數據集很大,有1559列,2000多條數據。先來看下前五條數據,在筆記本的新格子中輸入并 運行ads[:5]。
ads = pd.read_csv(data_filename, header=None, converters=converters) ads[:5]數據集所描述的是網上的圖像,目標是確定圖像是不是廣告。
從數據集表頭中無法獲知每列數據的含義。你下載的另外兩個文件ad.DOCUMENTATION和 ad.names有更多信息。前三 個特征分別指圖像的高度、寬度和寬高比。后一列是數據的類別, 1表示是廣告,0表示不是廣告。
將數據集加載到pandas之后,我們再來抽取用于分類算法的x矩陣和y數組,x矩陣為數據框除去后一列的所有列,y數組包含數據框的后一列,也就是列編號為#1558的列。
#ads = ads.astype(float).dropna() X = ads.drop(1558, axis=1).values y = ads[1558] print(X.shape) print(y.shape)主成分分析
主成分分析算法(Principal Component Analysis,PCA)的目的是找到能用較少信息描述數據集的特征組合。它意在發現彼此之間沒有相關性、能夠描述數據集的特征,確切說這些特征的方差跟整體方差沒有多大差距,這樣的特征也被稱為主成分。這也就意味著,借助這種方法,就能通過更少的特征捕獲到數據集的大部分信息。
PCA跟其他轉換器用法類似。它只有主成分數量這一個參數。它默認會返回數據集中的所有特征。然而,PCA會對返回結果根據方差大小進行排序,返回的第一個特征方差大,第二個特征方差稍小,以此類推。因此,前幾個特征往往就能夠解釋數據集的大部分信息。
from sklearn.decomposition import PCA pca = PCA(n_components=5) Xd = pca.fit_transform(X) Xd.shape輸出:(2359, 5)
返回的結果Xd矩陣只有五個特征,但是不容小覷,我們看一下每個特征的方差。
np.set_printoptions(precision=3, suppress=True) pca.explained_variance_ratio_輸出結果為:
array([ 0.854, 0.145, 0.001, 0. , 0. ])
表明第一個特征的方差對數據集總 體方差的貢獻率為85.4%。第二個為14.5%。第四個特征方差貢獻率不可能高于1‰,后面1553個 特征則更少。
用PCA算法處理數據一個不好的地方在于,得到的主成分往往是其他幾個特征的復雜組合, 例如,上述第一個特征就是通過為原始數據集的1558個特征(雖然很多特征值為0)分別乘以不 同權重得到的,前三個特征的權重依次為-0.092、-0.995和-0.024。經過某種組合得到的特征, 如果沒有豐富的研究經驗,理解起來很困難。
clf = DecisionTreeClassifier(random_state=14) scores_reduced = cross_val_score(clf, Xd, y, scoring='accuracy') print("The average score from the reduced dataset is {:.4f}".format(np.mean(scores_reduced)))輸出為:The average score from the reduced dataset is 0.9356。
這是經過PCA處理之后計算出的準確率。
PCA算法的另一個優點是,你可以把抽象難懂的數據集繪制成圖形。例如,把PCA返回的前 兩個特征做成圖形。
# 告訴IPython在當前筆記本作圖 %matplotlib inline from matplotlib import pyplot as plt# 獲取數據集中類別的所有取值(只有兩個:是廣告和不是廣告) classes = set(y) colors = ['red', 'green']# 用zip函數將這兩個列表組合起來,同時遍歷 for cur_class, color in zip(classes, colors):# 為屬于當前類別的所有個體創建遮罩層mask = (y == cur_class).valuesplt.scatter(Xd[mask,0], Xd[mask,1], marker='o', color=color, label=int(cur_class)) plt.legend()plt.show()總結
以上是生活随笔為你收集整理的创建自己的特征和转换器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用转换器抽取特征
- 下一篇: 如何给一个空白磁盘安装操作系统