您的位置:首页 > 其它

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

2018-09-11 08:57 302 查看

1.特征二元化

[code]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。

[code]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标准化

[code]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标准化

[code]from sklearn.preprocessing import StandardScaler

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

绝对值最大化标准化

[code]from sklearn.preprocessing import MaxAbsScaler

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

4.正则化

[code]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.过滤式特征选择

[code]#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.包裹式特征选择

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

[code]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)
[code]print('特征数',selector.n_features_) #2
print('特征评分',selector.ranking_) #特征评分 [3 1 2 1]

 

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐