使用sklearn进行数据预处理 特征选择

1.特征二元化

from sklearn.preprocessing import  Binarizer
#设置一个threshold值 大于该值为0  小于该值为1
def testBinarizer():
    X = [ [1,2,3,4,5],
         [5,4,3,2,1],
         [3,3,3,3,3],
         [1,1,1,1,1]]
    binarizer = Binarizer(threshold=2.5)
    print('转化后:',binarizer.transform(X))


testBinarizer()

输出结果

转化后: [[0 0 1 1 1]
 [1 1 1 0 0]
 [1 1 1 1 1]
 [0 0 0 0 0]]

2.独热编码one-hot encoding

用于处理无序离散特征,如代码中的color
独热编码会为每个离散值创建一个哑特征(dummy feature)。
什么是哑特征呢?举例来说,对于‘颜色’这一特征中的‘蓝色’,我们将其编码为[蓝色=1,绿色=0,红色=0],同理,对于‘绿色’,
我们将其编码为[蓝色=0,绿色=1,红色=0],特点就是向量只有一个1,其余均为0,故称之为one-hot。

import pandas as pd
from pandas import DataFrame
data = {'color':['green','red','blue'], 
      'size':['M','L','XL'], 
      'price':['10.1','13.5','15.3'],
      'classlabel':['class1','class2','class1']}

df = DataFrame(data)

from sklearn.preprocessing import LabelEncoder
class_le = LabelEncoder()
y = class_le.fit_transform(df['classlabel'].values)
#y转化为的值 array([0, 1, 0], dtype=int32)

#get_dummies默认会对DataFrame中所有字符串类型的列进行独热编码:
a = ['price', 'color', 'size']
pd.get_dummies(df[a])

输出结果

3.标准化

min-max标准化

from sklearn.preprocessing import  MinMaxScaler
import numpy as np

#x-min/max-min 1-0/2-0
X_train = np.array([[1,-1,2],
                   [2,0,0],
                   [0,1,-1]])
min_max_scaler = MinMaxScaler()
x_train_minmax = min_max_scaler.fit_transform(X_train)
print(x_train_minmax)

输出结果:

[[ 0.5         0.          1.        ]
 [ 1.          0.5         0.33333333]
 [ 0.          1.          0.        ]]

z-score标准化

from sklearn.preprocessing import StandardScaler

计算公式 :(X-mean)/std

绝对值最大化标准化

from sklearn.preprocessing import MaxAbsScaler

计算公式:将每个属性除以该属性的绝对值中的最大值

4.正则化

from sklearn.preprocessing import Normalizer

def test_Normalizer():
    X = [ [1,2,3,4,5],
         [5,4,3,2,1],
         [3,3,3,3,3],
         [1,1,1,1,1]]
    normalizer = Normalizer(norm='l1')
    print(normalizer.transform(X))

test_Normalizer()

输出结果:

[[ 0.06666667  0.13333333  0.2         0.26666667  0.33333333]
 [ 0.33333333  0.26666667  0.2         0.13333333  0.06666667]
 [ 0.2         0.2         0.2         0.2         0.2       ]
 [ 0.2         0.2         0.2         0.2         0.2       ]]

将norm参数调整为l2 会收敛得更快

5.过滤式特征选择

#1.方差选择法
#使用方差作为特征评分标准 如果某个特征的取值差异不大 通常认为该特征对区分样本的贡献度不大
#因此 在构造特征的过程中去掉方差小于阈值的特征

from sklearn.datasets import load_iris
iris = load_iris()
#print('特征名称',iris.feature_names)
#print('特征矩阵',iris.data)

from sklearn.feature_selection import VarianceThreshold
vt = VarianceThreshold(threshold = 1) #方差的阈值 默认0
vt = vt.fit_transform(iris.data)
#print(vt)#只保留了第三列的特征 其他的都去掉了

#单变量 该列与标签列的相关度
#分类问题采用卡方检验 作为特征评分标准 
#值越大 相关性越强  回归问题可以使用皮尔逊相关系数
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest#选前k个最好的
from sklearn.feature_selection import chi2 #卡方检验

skb = SelectKBest(chi2,k=2)
new_data = skb.fit_transform(iris.data,iris.target)
print(new_data)#保留了第三列和第四列

from sklearn.datasets import load_iris
iris = load_iris()

from sklearn.feature_selection import  SelectKBest
from scipy.stats import pearsonr #皮尔逊相关系数
from numpy import array

skb = SelectKBest(lambda X,Y:tuple(map(tuple,array(list(map(lambda x:pearsonr(x,Y),X.T))).T)),k=3)
skb = skb.fit_transform(iris.data,iris.target)
print(skb)#保留三个特征

6.包裹式特征选择

反复的构建模型 然后选择最好的或最坏的 可以根据系数来选
把选出来的特征选择出来 然后在剩余的特征上重复这个过程 直到所有的特征都遍历
这个过程中被消除的次数就是特征的排序 因此这是一张寻找最优特征子集的贪心算法

from sklearn.svm import LinearSVC #选择一个模型
from sklearn.datasets import load_iris #加载数据集
from sklearn.feature_selection import RFE #特征选择的方法

# step -- 默认1,即每次迭代移除一个特征
# verbose = 1      # 显示中间过程
iris = load_iris()
x = iris.data
y = iris.target
estimator = LinearSVC()
#特征集中剩余的特征个数 n_features_to_select=2 
selector = RFE(estimator=estimator,n_features_to_select=2,verbose = 1 )
selector.fit(x,y)

输出:

Fitting estimator with 4 features.
Fitting estimator with 3 features.

Out[9]:

RFE(estimator=LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,
     intercept_scaling=1, loss='squared_hinge', max_iter=1000,
     multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,
     verbose=0),
  n_features_to_select=2, step=1, verbose=1)
print('特征数',selector.n_features_) #2
print('特征评分',selector.ranking_) #特征评分 [3 1 2 1]

猜你喜欢

转载自blog.csdn.net/qq_33361080/article/details/82619892