樣本中的有些特徵是所謂的「優秀特徵」,使用這些特徵可以顯著的提高泛化能力。而有些特徵在樣本類別區分上並不明顯,在訓練中引入這些特徵會導致算力的浪費;另外有些特徵對樣本的分類有反作用,引入這些特徵反而會導致泛化能力下降
與pca(主成分分析)不同,特徵篩選不修改特徵值,而是尋找對模型效能提公升較大的盡量少的特徵
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
titan = pd.read_csv("")
titan.info()
rangeindex: 1313 entries, 0 to 1312
data columns (total 11 columns):
row.names 1313 non-null int64
pclass 1313 non-null object
survived 1313 non-null int64
name 1313 non-null object
age 633 non-null float64
embarked 821 non-null object
home.dest 754 non-null object
room 77 non-null object
ticket 69 non-null object
boat 347 non-null object
*** 1313 non-null object
dtypes: float64(1), int64(2), object(8)
memory usage: 112.9+ kb
x_source = titan.drop(["row.names","name","survived"],axis=1)
x_source.info()
y_source = titan["survived"]
rangeindex: 1313 entries, 0 to 1312
data columns (total 8 columns):
pclass 1313 non-null object
age 633 non-null float64
embarked 821 non-null object
home.dest 754 non-null object
room 77 non-null object
ticket 69 non-null object
boat 347 non-null object
*** 1313 non-null object
dtypes: float64(1), object(7)
memory usage: 82.1+ kb
x_source['age'].fillna(x_source['age'].mean(),inplace=true)
x_source.fillna('unknown',inplace=true)
x_source.info()
rangeindex: 1313 entries, 0 to 1312
data columns (total 8 columns):
pclass 1313 non-null object
age 1313 non-null float64
embarked 1313 non-null object
home.dest 1313 non-null object
room 1313 non-null object
ticket 1313 non-null object
boat 1313 non-null object
*** 1313 non-null object
dtypes: float64(1), object(7)
memory usage: 82.1+ kb
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(x_source,y_source,random_state=33,test_size=0.25)
x_train.info()
int64index: 984 entries, 1086 to 1044
data columns (total 8 columns):
pclass 984 non-null object
age 984 non-null float64
embarked 984 non-null object
home.dest 984 non-null object
room 984 non-null object
ticket 984 non-null object
boat 984 non-null object
*** 984 non-null object
dtypes: float64(1), object(7)
memory usage: 69.2+ kb
from sklearn.feature_extraction import dictvectorizer
vec = dictvectorizer()
x_train = vec.fit_transform(x_train.to_dict(orient='record'))
x_test = vec.transform(x_test.to_dict(orient='record'))
len(vec.feature_names_)
474
from sklearn.tree import decisiontreeclassifier
dt = decisiontreeclassifier(criterion='entropy')
dt.fit(x_train,y_train)
dt.score(x_test,y_test)
0.82066869300911849
from sklearn import feature_selection
fs = feature_selection.selectpercentile(feature_selection.chi2,percentile=7)
x_train_fs = fs.fit_transform(x_train,y_train)
x_test_fs = fs.transform(x_test)
print(x_train.shape,x_train_fs.shape)
(984, 474) (984, 33)
dt.fit(x_train_fs,y_train)
dt.score(x_test_fs,y_test)
0.85410334346504557
基於sklearn的特徵選擇方法
在資料探勘工作中,通常處理的是乙個包含大量特徵且含義未知的資料集,並基於該資料集挖掘到有用的特徵。那麼這裡面一般是四個步驟 特徵工程 特徵選擇 模型構造 模型融合。特徵工程主要是清洗特徵 刪除無用特徵和構造新特徵,經過特徵工程這個過程我們可能會得到大量的特徵 而特徵選擇的目的就是從這大量的特徵中挑選...
基於sklearn的文字特徵抽取
機器學習的樣本一般都是特徵向量,但是除了特徵向量以外經常有非特徵化的資料,最常見的就是文字 當某個特徵為有限的幾個字串時,可以看成一種結構化資料,處理這種特徵的方法一般是將其轉為獨熱碼的幾個特徵。例如僅能取三個字串的特徵 a,b,c,可以將其轉換為001,010,100的三個特徵。當特徵僅是一系列字...
sklearn 特徵工程
資料和特徵決定了機器學習的上限,而模型和演算法只是逼近這個上限而已。那特徵工程到底是什麼呢?顧名思義,其本質是一項工程活動,目的是最大限度地從原始資料中提取特徵以供演算法和模型使用。特徵工程就是將文字資料轉化為數字,因為計算機只能識別數字,運算數字 categorical features 分類特徵...