scikit-learn中标准化和归一化

1 归一化


归一化:我们通俗的可以理解为将数值映射到(0,1)之间。在机器学习之中我们可以理解为将某一特征的取值(也就是某一列)映射到(0,1)之间。

公式:

x i − m i n ( x i ) m a x ( x i ) − m i n ( x i ) \frac{x_i-min(x_i)}{max(x_i)-min(x_i)} max(xi)min(xi)ximin(xi)

公式中 x i x_i xi是针对某一特征(也就是某一列)来计算的,接下来我们来看一下scikit-learn中的使用:

u = [[ 1., 1.,  2.],[ 2.,  1.,  0.],[ 0.,  1., 1.]]
minMax=MinMaxScaler()
minMax.fit(u)
print(minMax.transform(u))
print(minMax.fit_transform(u))
====================================================
output:
[[0.5 0.  1. ]
 [1.  0.  0. ]
 [0.  0.  0.5]]
[[0.5 0.  1. ]
 [1.  0.  0. ]
 [0.  0.  0.5]]

应该可以看出来上面的代码中.fit_transform为fit和transform的组合。


标准化


标准化: 同样的标准化的意思时就是将数据映射为均值为0,方差为1 在机器学习之中我们可以理解为将某一特征的取值(也就是某一列)映射为均值为0 方差为1.

公式:

x i − x ˉ σ \frac{x_i- \bar{x}}{\sigma} σxixˉ

公式中 x ˉ \bar{x} xˉ是均值, σ {\sigma} σ为标准差,接下来我们来看一下scikit-learn中的使用:

  1. sklearn.preprocessing import scale的使用
X = [[ 1., -1.,  2.],[ 2.,  0.,  0.],[ 0.,  1., -1.]]
from sklearn.preprocessing import scale
print(scale(X))
output:
[[ 0.         -1.22474487  1.33630621]
 [ 1.22474487  0.         -0.26726124]
 [-1.22474487  1.22474487 -1.06904497]]
  1. sklearn.preprocessing import StandardScaler的使用
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X)
print(scaler.transform(X))
output:
[[ 0.         -1.22474487  1.33630621]
 [ 1.22474487  0.         -0.26726124]
 [-1.22474487  1.22474487 -1.06904497]]

这两个是有区别的,首先scale是一个方法,而StandardScaler是类,那么区别来了,也就是我们可以将之前fit的参数(mean,std)保留直接应用到别的数据,我们可以通过下面的例子来区别。

u = [[ 1., 1.,  2.],[ 2.,  1.,  0.],[ 0.,  1., 1.]]
print(scaler.transform(u))
print(scale(u))
output:
[[ 0.          1.22474487  1.33630621]
 [ 1.22474487  1.22474487 -0.26726124]
 [-1.22474487  1.22474487  0.53452248]]
=======================================
[[ 0.          0.          1.22474487]
 [ 1.22474487  0.         -1.22474487]
 [-1.22474487  0.          0.        ]]

我们在机器学习中,通常采用StandardScaler,原因如下:

1 保存方差和均值,应用在测试集上。

2 因为我们训练集和测试集默认是同分布的,所以在训练集的均值和方差可以当作是总体的。

3 因此,我们可以用在测试集上,这样就使用 StandardScaler

  • scikit-learn 调用SVM例子
import sys
 
from sklearn.preprocessing import MinMaxScaler
 
sys.path.extend(["../../", "../", "./"])
import pandas as pd
import math
from sklearn.metrics import classification_report
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV
from sklearn import metrics
from sklearn.model_selection import cross_val_predict
import numpy as np
from sklearn.decomposition import PCA
 
# 数据读取和划分
def get_data():
    X = pd.read_csv("oldncp.csv",header=None, sep=",")
    y = np.array([0] * 880 + [1] * 880)
    return X, y
# 网格搜索
def get_bestparameter(X, y, cv, cpu_num):
    a = [2 ** x for x in range(-2, 5)]
    b = [2 ** x for x in range(-5, 2)]
    parameters = [
        {
            'C': a,
            'gamma': b,
            'kernel': ['rbf']
        },
        {
            'C': a,
            'kernel': ['linear']
        }
    ]
    clf = GridSearchCV(SVC(probability=True), parameters, cv=cv, scoring='accuracy', n_jobs=cpu_num)
    clf.fit(X, y)
    print("Best parameters set found on development set:")
    print("parameters:{}".format(clf.best_params_))
    print(clf.best_score_)
    return clf
# 独立测试集
def supply_data(X1, y1, clf):
    print("------------------supplied the test set----------------------------")
    pre = clf.predict(X1)
    print("ACC:{}".format(metrics.accuracy_score(y1, pre)))
    print("MCC:{}".format(metrics.matthews_corrcoef(y1, pre)))
    print(classification_report(y1, pre))
    print("confusion matrix\n")
    print(pd.crosstab(pd.Series(y1, name='Actual'), pd.Series(pre, name='Predicted')))
# 交叉验证
def cross_validation(parameters, X, y, cv, cpu_num):
    print("------------------------cv--------------------------")
    p = parameters
    print("参数:{}".format(p))
    label = [0, 1]
    classifier = SVC(C=p["C"], kernel=p["kernel"], gamma=p["gamma"], probability=True)
    predicted = cross_val_predict(classifier, X, y, cv=cv, n_jobs=cpu_num)
    predict_prob = cross_val_predict(classifier, X, y, cv=cv, n_jobs=cpu_num, method='predict_proba')
    AUC = metrics.roc_auc_score(y, predict_prob[:, 1])
    print("AUC:{}".format(AUC))
    print("ACC:{}".format(metrics.accuracy_score(y, predicted)))
    print("MCC:{}".format(metrics.matthews_corrcoef(y, predicted)))
    print(classification_report(y, predicted, labels=label))
    print("confusion matrix\n")
    print(pd.crosstab(pd.Series(y, name='Actual'), pd.Series(predicted, name='Predicted')))
 
def main():
    cv = 10
    cpu_num = -1
    X, y = get_data()
    clf = get_bestparameter(X, y, cv, cpu_num)
    parameters = clf.best_params_
    cross_validation(parameters, X, y, cv, cpu_num)
 
if __name__ == '__main__':
    main()
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值