归一化:我们通俗的可以理解为将数值映射到(0,1)之间。在机器学习之中我们可以理解为将某一特征的取值(也就是某一列)映射到(0,1)之间。
公式:
公式中 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 ˉ \bar{x} xˉ是均值, σ {\sigma} σ为标准差,接下来我们来看一下scikit-learn中的使用:
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]]
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
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()