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]]
用于处理无序离散特征,如代码中的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])
输出结果
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
计算公式:将每个属性除以该属性的绝对值中的最大值
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 会收敛得更快
#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)#保留三个特征
反复的构建模型 然后选择最好的或最坏的 可以根据系数来选
把选出来的特征选择出来 然后在剩余的特征上重复这个过程 直到所有的特征都遍历
这个过程中被消除的次数就是特征的排序 因此这是一张寻找最优特征子集的贪心算法
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]