赞
踩
特征缩放是机器学习中数据预处理的关键技术。本文简要介绍其概念和实现。
通常,数据集将包含在大小,单位和范围上变化的特征。大多数机器学习算法在计算中使用两个数据点之间的欧氏距离,这是一个问题。
如果不处理数据,这些算法只考虑特征的大小,不同点之间的结果会有很大差异。在距离计算中,高强度的特征要比低强度的特征重要得多。
为了纠正这种影响,我们需要把所有的特征都提升到相同的程度。这可以通过缩放来实现。
缩放技术可以有多种方式。我们主要关注标准化和归一化。
归一化是将单个样本缩放为具有单位范数的过程(重新缩放为0到1的范围)。每个属性的最大值是1,最小值是0。
标准化将值重新缩放为其z分数。平均值为0,标准差为1(单位方差)。
其中x是原始特征向量,x bar是该特征向量的均值,而sigma是其标准差。
让我们看一个例子如何改变数据。我使用每个初学者最喜欢的《泰坦尼克号:灾难机器学习》数据集(https://www.kaggle.com/c/titanic/data)。
我仅观察“年龄特征”。
原始数据
在缩放数据之前,请注意NULL值和离群值,因为这会影响均值和标准差。
我们来查看一下对机器学习模型准确性的影响。
归一化
# Create Data Setpredictor = df_titanic_basedata_train_1.drop(['Survived'], 1).valuestarget = df_titanic_basedata_train_1['Survived'].valuesfrom sklearn import preprocessing# normalize the data attributespredictor_normalized = preprocessing.normalize(predictor)sns.distplot(pd.DataFrame(predictor_normalized).iloc[:,2], bins = 10, hist = True).set_title('Titanic_Normalized_Age')
标准化
# Create Data Setpredictor = df_titanic_basedata_train_1.drop(['Survived'], 1).valuestarget = df_titanic_basedata_train_1['Survived'].valuesfrom sklearn.preprocessing import StandardScalerscale = StandardScaler()scale.fit(predictor)predictor_standard = scale.transform(predictor)sns.distplot(pd.DataFrame(predictor_standard).iloc[:,2], bins = 10, hist = True).set_title('Titanic_Standardize_Age')
显然,在归一化和标准化之后,数据分发的方式有所不同。
对机器学习模型的影响
我正在实现XGradient Booting和逻辑回归,并比较两个模型的准确性。
from sklearn import preprocessing# normalize the data attributespredictor_normalized = preprocessing.normalize(predictor)# Split data to 80% training data and 20% of test to check the accuracy of our modelX_train, X_test, y_train, y_test = train_test_split(predictor_normalized, target, test_size=0.2, random_state=0)#Import Gradient Boosting Classifier modelfrom sklearn.ensemble import GradientBoostingClassifier#Create Gradient Boosting Classifiergb = GradientBoostingClassifier()#X_train, X_test, y_train, y_test #Train the model using the training setsgb.fit(X_train, y_train)#Predict the response for test datasety_pred = gb.predict(X_test)#Import scikit-learn metrics module for accuracy calculationfrom sklearn import metrics# Model Accuracy, how often is the classifier correct?print("XGB Accuracy:",metrics.accuracy_score(y_test, y_pred))## Lets call logistic regression#Modelfrom sklearn.model_selection import train_test_splitfrom sklearn.model_selection import cross_val_scorefrom sklearn.linear_model import LogisticRegressionlogreg = LogisticRegression()logreg.fit(X_train,y_train)y_pred = logreg.predict(X_test)print ("Logistic Regression Accuracy: {}".format(round(accuracy_score(y_test,y_pred),4)))
XGB Accuracy: 0.8212290502793296
Logistic Regression Accuracy: 0.7039
标准化
from sklearn.preprocessing import StandardScalerscale = StandardScaler()scale.fit(predictor)predictor_standard = scale.transform(predictor)# Split data to 80% training data and 20% of test to check the accuracy of our modelX_train, X_test, y_train, y_test = train_test_split(predictor_standard, target, test_size=0.2, random_state=0)#Import Gradient Boosting Classifier modelfrom sklearn.ensemble import GradientBoostingClassifier#Create Gradient Boosting Classifiergb = GradientBoostingClassifier()#X_train, X_test, y_train, y_test #Train the model using the training setsgb.fit(X_train, y_train)#Predict the response for test datasety_pred = gb.predict(X_test)#Import scikit-learn metrics module for accuracy calculationfrom sklearn import metrics# Model Accuracy, how often is the classifier correct?print("XGB Accuracy:",metrics.accuracy_score(y_test, y_pred))## Lets call logistic regression#Modelfrom sklearn.model_selection import train_test_splitfrom sklearn.model_selection import cross_val_scorefrom sklearn.linear_model import LogisticRegressionlogreg = LogisticRegression()logreg.fit(X_train,y_train)y_pred = logreg.predict(X_test)print ("Logistic Regression Accuracy: {}".format(round(accuracy_score(y_test,y_pred),4)))
XGB Accuracy: 0.8324022346368715
Logistic Regression Accuracy: 0.8101
归一化可提供82%和70%的准确性,而标准化后可提供83%和81%的准确性。显然,缩放方法会影响模型的准确性。
那么哪种方法是缩放数据的最佳方法呢?不确定。
一个很好的技巧是创建测试数据集的按比例缩放的副本,并使用测试工具和您想抽查的少数算法来实现模型。这可以查看哪种缩放方法更值得进一步研究。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。