交叉验证--分离训练集和测试集--标准化归一化--数据特征筛选

目录

1,将全部数据分离成训练集和测试集(之前首先先将x和y分类出来才可以)

2,将训练集分离做交叉验证

3、归一化----标准化---正则化----Python的实现

1、(0,1)标准化:

2、Sigmoid函数

4、sklearn数据特征重要程度的筛选


Python特征选择的四种方法(参考网址)

1,将全部数据分离成训练集和测试集(之前首先先将x和y分类出来才可以)

'''
分离数据集--
test_size  :如果是整数则选出来两个测试集,如果是小数,则是选择测试集所占的百分比。
train_size :同理,都含有默认值0.25
shuffle   :默认为True,表示 在分离之前是否将其打乱,如果不打乱就设为False
random_state:是随机数的种子。(感觉没什么用,因此每次都填1吧)
随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。
比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。
但填0或不填,每次都会不一样。
随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个规则:
种子不同,产生不同的随机数;种子相同,即使实例不同也产生相同的随机数。

'''
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=4, random_state=42)

结果:

分离成train

[[8 8 1 1 6]]      [[0]]

test

[[8 9 6 7 0]
 [8 7 6 9 0]
 [9 3 9 8 5]
 [0 8 8 1 3]]

[[0]
 [1]
 [0]
 [0]]

2,将训练集分离做交叉验证

就是将索引分离

from sklearn.cross_validation import KFold
kf = KFold(9, n_folds=3, random_state=2)

for train, test in kf:
    print(train)
    print(test)

'''
9:代表测试集的例子的个数

[3 4 5 6 7 8]
[0 1 2]
-----------------------
[0 1 2 6 7 8]
[3 4 5]
-----------------------
[0 1 2 3 4 5]
[6 7 8]

'''
for train, test in kf:
    # The predictors we're using the train the algorithm.  Note how we only take the rows in the train folds.
    train_predictors = (titanic[predictors].iloc[train,:])
    # The target we're using to train the algorithm.
    train_target = titanic["Survived"].iloc[train]
    # Training the algorithm using the predictors and target.
    alg.fit(train_predictors, train_target)
    # We can now make predictions on the test fold
    test_predictions = alg.predict(titanic[predictors].iloc[test,:])
    predictions.append(test_predictions)

3、归一化----标准化---正则化----Python的实现

1、实现归一化的Max-Min--(0,1)标准化:

from sklearn.preprocessing import MinMaxScaler

这是最简单也是最容易想到的方法,通过遍历feature vector里的每一个列数据,将Max和Min的记录下来,并通过Max-Min作为基数(即Min=0,Max=1)进行数据的归一化处理:

def MaxMinNormalization(x,Max,Min):  
    x = (x - Min) / (Max - Min);  
    return x;  
'''
sklearn 包就是这么处理的,输入必须是二维数组,每个尺度是纵向分的,

举个例子X_train为(2,3)矩阵,Min为第一列的最小值,第二列的最小值,第三列的最小值
                            Max 为第一列的最大值,为第一列的最大值,第二列的最大值

下面的例子结果:temp
array([[0., 1., 0.],
       [1., 0., 1.]])
scaler.scale_   为   1/ (Max - Min)
array([0.5       , 0.5       , 0.33333333])
'''
import numpy as np
from sklearn.preprocessing import MinMaxScaler

X_train = np.array([[ 2., 4.,  2.], 
                    [4,   2,    5]
                   ])
scaler = MinMaxScaler(feature_range=(0, 1))

X_scaled = scaler.fit_transform(X_train)
print(scaler.scale_)#  array([0.5       , 0.5       , 0.33333333])
scaler.min_      #     array([-1.        , -1.        , -0.66666667])

scaler.inverse_transform(X_train )  # 预测完成后你归一化 要保证和X_train 一个形状

还有一个函数fit_transform很像transform,这里就用fit_transform就可以,什么情况下都用fit_transform,就完事了

scaler.min_  目前代表什么还不知道呢。

scaler.inverse_transform(X_train )  # 预测完成后你归一化 要保证和X_train 一个形状

回归预测一般来说是(n,1)数据预测(n,1)的数据(有一些预测结果是(n,)的数据,需要变成(n,1)的数据,其实(n,)经验证也可以,)

将预测结果传入inverse_transform  API 中,即可。

找大小的方法直接用np.max()np.min()就行了,尽量不要用python内建的max()和min(),除非你喜欢用List.可以试试np.argsort()np.argmax()

2、实现中心化和正态分布的Z-Score---最大最小归一化--用于稀疏数据的MaxAbs--针对离群点的--可视化展示原始数据以及标准化后的数据

zscore_scaler = preprocessing.StandardScaler()  # 建立StandardScaler对象
data_scale_1 = zscore_scaler.fit_transform(data)  # StandardScaler标准化处理

data的结构可以是numpy.array类型 也可以是dateframe类型

 

#  标准化,让运营数据落入相同的区间
import numpy as np
from sklearn import preprocessing
import matplotlib.pyplot as plt

data = np.loadtxt('data6.txt', delimiter='\t')  # 读取数据,n行2列的数据

# Z-Score标准化
zscore_scaler = preprocessing.StandardScaler()  # 建立StandardScaler对象
data_scale_1 = zscore_scaler.fit_transform(data)  # StandardScaler标准化处理

# Max-Min标准化
minmax_scaler = preprocessing.MinMaxScaler()  # 建立MinMaxScaler模型对象
data_scale_2 = minmax_scaler.fit_transform(data)  # MinMaxScaler标准化处理

# MaxAbsScaler标准化
maxabsscaler_scaler = preprocessing.MaxAbsScaler()  # 建立MaxAbsScaler对象
data_scale_3 = maxabsscaler_scaler.fit_transform(data)  # MaxAbsScaler标准化处理

# RobustScaler标准化
robustscalerr_scaler = preprocessing.RobustScaler()  # 建立RobustScaler标准化对象
data_scale_4 = robustscalerr_scaler.fit_transform(data)  # RobustScaler标准化标准化处理

# 展示多网格结果
data_list = [data, data_scale_1, data_scale_2, data_scale_3, data_scale_4]  # 创建数据集列表
scalar_list = [15, 10, 15, 10, 15, 10]  # 创建点尺寸列表
color_list = ['black', 'green', 'blue', 'yellow', 'red']  # 创建颜色列表
merker_list = ['o', ',', '+', 's', 'p']  # 创建样式列表
title_list = ['source data', 'zscore_scaler', 'minmax_scaler', 'maxabsscaler_scaler', 'robustscalerr_scaler']  # 创建标题列表
for i, data_single in enumerate(data_list):  # 循环得到索引和每个数值
    plt.subplot(2, 3, i + 1)  # 确定子网格
    plt.scatter(data_single[:, :-1], data_single[:, -1], s=scalar_list[i], marker=merker_list[i],
                c=color_list[i])  # 子网格展示散点图
    plt.title(title_list[i])  # 设置子网格标题
plt.suptitle("raw data and standardized data")  # 设置总标题
plt.show()  # 展示图形

 

4、Sigmoid函数

Sigmoid函数是一个具有S形曲线的函数,是良好的阈值函数,在(0, 0.5)处中心对称,在(0, 0.5)附近有比较大的斜率而当数据趋向于正无穷和负无穷的时候,映射出来的值就会无限趋向于1和0.

个人非常喜欢的“归一化方法”,之所以打引号是因为我觉得Sigmoid函数在阈值分割上也有很不错的表现,根据公式的改变,就可以改变分割阈值,这里作为归一化方法,我们只考虑(0, 0.5)作为分割阈值的点的情况:

def sigmoid(X,useStatus):  #这里useStatus管理是否使用sigmoid的状态,方便调试使用
    if useStatus:  
        return 1.0 / (1 + np.exp(-float(X)))
    else:  
        return float(X)

4、sklearn数据特征重要程度的筛选

from sklearn.feature_selection import SelectKBest, f_classif
import matplotlib.pyplot as plt

selector = SelectKBest(f_classif,k='all')  #或者k=3:特征的个数
'''
dateframtop1_name_x_train[predictors]  是一个dataframe结构predictors是列名的列表
dateframtop1_name_y_train   因为这里只有一列所以没有列名
'''
selector.fit(dateframtop1_name_x_train[predictors], dateframtop1_name_y_train) #核心函数
scores = -np.log10(selector.pvalues_)
#画图
plt.bar(range(len(predictors)), scores)   #画柱状图,比如三个柱子
plt.xticks(range(len(predictors)), predictors, rotation='vertical')  #这个是在每一柱子下说明名字
plt.show()

#特征的平分如下

 


版权声明:本文为weixin_42053726原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。