基於sklearn的特徵篩選

2021-09-21 05:57:43 字數 3955 閱讀 5614

樣本中的有些特徵是所謂的「優秀特徵」,使用這些特徵可以顯著的提高泛化能力。而有些特徵在樣本類別區分上並不明顯,在訓練中引入這些特徵會導致算力的浪費;另外有些特徵對樣本的分類有反作用,引入這些特徵反而會導致泛化能力下降

與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 分類特徵...