springboot 实现机器学习_机器学习中的特征缩放及Python实现

特征缩放是机器学习中数据预处理的关键技术。本文简要介绍其概念和实现。

为什么我们需要特征缩放?

通常,数据集将包含在大小,单位和范围上变化的特征。大多数机器学习算法在计算中使用两个数据点之间的欧氏距离,这是一个问题。

如果不处理数据,这些算法只考虑特征的大小,不同点之间的结果会有很大差异。在距离计算中,高强度的特征要比低强度的特征重要得多。

为了纠正这种影响,我们需要把所有的特征都提升到相同的程度。这可以通过缩放来实现。

如何进行数据缩放?

缩放技术可以有多种方式。我们主要关注标准化和归一化。

归一化是将单个样本缩放为具有单位范数的过程(重新缩放为0到1的范围)。每个属性的最大值是1,最小值是0。

标准化将值重新缩放为其z分数。平均值为0,标准差为1(单位方差)。

00accae39edbd8e21bf91de6091eef30.png

其中x是原始特征向量,x bar是该特征向量的均值,而sigma是其标准差。

Python示例

让我们看一个例子如何改变数据。我使用每个初学者最喜欢的《泰坦尼克号:灾难机器学习》数据集(https://www.kaggle.com/c/titanic/data)。

我仅观察“年龄特征”。

原始数据

c63393c10fc696aba77be6b02b8f1137.png

在缩放数据之前,请注意NULL值和离群值,因为这会影响均值和标准差。

b0260090428dc8c2a9c2b84e575a6058.png

我们来查看一下对机器学习模型准确性的影响。

归一化

# 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')
dde2c64ede8f10c674b00fbf1b34a685.png

标准化

# 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')
f897e2f7128e2f2f3441cab8418fab74.png

显然,在归一化和标准化之后,数据分发的方式有所不同。

对机器学习模型的影响

我正在实现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%的准确性。显然,缩放方法会影响模型的准确性。

那么哪种方法是缩放数据的最佳方法呢?不确定。

一个很好的技巧是创建测试数据集的按比例缩放的副本,并使用测试工具和您想抽查的少数算法来实现模型。这可以查看哪种缩放方法更值得进一步研究。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值