ml是什么单位(“千克”和“毫升”:单位不同就不能做朋友了吗?)

“千克”和“毫升”:单位不同就不克不及做伴侣了吗?

全文共3819字,估计学习时长18分钟


图源:unsplash


你一定曾碰到过如许一个数据集,它具有多个特性,涵盖了不同水平的数目级、范围和单位。这会是一个宏大的拦阻,很少的呆板学习算法对这些特性高度敏感。


真实相似的成绩并不少见。比如,一个特性的单位是千克,另一个的单位是克,另有一个的单位是升。当它们所出现的内容差别云云之大时,该怎样使用这些特性呢?


该是特性缩放上场的时分了。这是数据预处理阶段的关键局部,但很多初学者无视了这一点,这会侵害他们的呆板学习模子。


特性缩放可以明显提高某些呆板学习算法的功能,而对其他算端正完全不起作用。这种怪事眼前的缘故原因约莫是什么?


别的,归一化和尺度化的区别是什么?这是呆板学习中最常用的两种特性缩放武艺,但它们不易了解。什么时分应该使用哪种武艺?


本文将解答你关于特性缩放的疑问,将在Python中完成特性缩放,让你对它怎样实用于不同的呆板学习算法有一个实际上的了解。


为什么要使用特性缩放?


必要办理的第一个成绩是,为什么必要缩放数据会合的变量。一些呆板学习算法对特性缩放敏感,而另一些则几乎不乱。


基于距离的算法


距离算法(比如KNN、K-means和SVM)受特性范围的影响最大。这是由于在背景,算法使用数据点之间的距离来确定它们的相似性。


比如,假定有一些数据,此中包孕高中先生的CGPA分数(从0到5)和他们的将来支出(以千卢比为单位):


由于这两个特性具有不同的缩放水平,以是有约莫给更高量级的特性更高的权重。这将影响呆板学习算法的功能,显然,我们不渴望算法倾向于一个特性。


因此,我们在使用基于距离的算法之前对数据举行缩放,如许一切的特性对后果的影响都是相称的。


当比力先生A和B的数据点之间的欧氏距离、B和C的数据点之间的欧氏距离,缩放前后的后果是分明的,如下所示:


· 缩放前AB距离 =>

· 缩放前BC距离 =>

· 缩放后AB距离 =>

· 缩放后BC距离 =>

缩放将一切特性都带入盘算,并且如今的距离比缩放之前更具有可比性。


基于梯度下降的算法


使用梯度下降作为优化武艺的呆板学习算法(比如线性回归、逻辑回归、神经网络等)要求对数据举行缩放。请看底下的梯度下降公式:


公式中特性值X的存在将影响梯度下降的步长。特性范围的差别将招致每个特性的步长不同。为确保梯度下降安稳地向最小值挪动,并确保一切特性的梯度下降步调均以相反的速率更新,我们在将数据输入模子之前先对数据举行缩放。


具有相似缩放水平的特性可以协助梯度下降更快地收敛到最小值。


基于树的算法


另一方面,基于树的算法对特性缩放十分不敏感。思索一下,决定树仅基于单个特性拆分节点。决定树在特性上支解节点,从而增长了节点的同质性。特性上的拆分不受其他特性影响。


图源:unsplash


因此,其他特性对拆分几乎没有影响。这就是特性缩放不改动算法功能的缘故原因!


什么是归一化?


归一化是一种缩放武艺,对值举行移位和重新缩放,以使它们终极在0到1之间厘革。这也称为“最小-最大”缩放。


这是归一化的公式:

此中,Xmax和Xmin分别为特性的最大值和最小值。


· 当X的值是列中的最小值时,分子为0,因此X '为0

· 相反,当X的值是列中的最大值时,分子即是分母,因此X '的值是1

· 假如X的值在最小值和最大值之间,那么X '的值在0和1之间


什么是尺度化?


尺度化是另一种缩放武艺,此中值以具有单位尺度偏向的均匀值为中央。这意味着特性的均值变为零,后果分布具有单位尺度差。


这是尺度化的公式:

μ为特性值的均值,σ为特性值的尺度差。注意,在这种情况下,值并不范围于特定的范围。


图源:unsplash


如今,你脑海中最大的成绩一定是什么时分应该使用归一化,什么时分应该使用尺度化?底下就来看看!

最大的成绩——归一化照旧尺度化?


归一化与尺度化是呆板学习初学者的一个永久的成绩。


· 假如数据分布不依照高斯分布,归一化是很有效的。这在不假定命据分布的算法(如k近邻和神经网络)中很有效。


· 相反,假如数据听从高斯分布,尺度化是有效的。但是,这并不一定对。别的,与归一化不同,尺度化没有界限范围。因此,即使数据中有十分值,也不会遭到尺度化的影响。


但是,终极使用归一化照旧尺度化将取决于成绩和正在使用的呆板学习算法。没有硬性的端正来确定何时将数据归一化或尺度化。可以从将模子拟合为原始的、归一化的和尺度化的数据末了,并比力功能以取得最佳后果。


好的做法是将缩放器与练习数据举行拟合,然后使用缩放器对测试数据举行转换。这将制止模子测试历程中的任何数据泄漏。别的,通常不必要调停目标值。

在Python中完成特性缩放


如今是幽默的局部,将学到的东西付诸实际。接纳DataHack平台的BigMart数据集,可将特性缩放使用于一些呆板学习算法。


图源:unsplash


跳过预处理步调,由于它们超出了本教程的范围。但是可以在这篇文章中找到预处理的具体表明。这些步调将使你可以在黑客马拉松排行榜上排名前20位,因此值得一试!


因此,起首将数据分为练习和测试集:


# spliting training and testing data from sklearn.model_selection import train_test_split X= df y= target X_train, X_test, y_train, y_test =train_test_split(X,y,test_size=0.2,random_state=27)


在转到特性缩放局部之前,使用pd.describe()办法欣赏有关数据的具体信息:


可以看到,特性的值范围存在宏大差别:Item_Visibility,Item_Weight,Item_MRP和Outlet_ Establishmentment_Year。实验使用特性缩放来办理该成绩!


注意:特性Item_Visibility中有负值,这是由于已接纳对数转换来处理特性中的偏斜度。


使用sklearn举行归一化


为了归一化数据,必要从sklearn库导入MinMaxScalar并将其使用于数据集。以是,底下就末了吧!


# data normalization with sklearn from sklearn.preprocessing importMinMaxScaler # fitscaler on training data norm=MinMaxScaler().fit(X_train) #transform training data X_train_norm= norm.transform(X_train) #transform testing dataabs X_test_norm= norm.transform(X_test)


请看归一化怎样影响数据集:


如今,一切特性的最小值均为0,最大值为1。完善!


接下去,实验对数据举行尺度化。


使用sklearn举行尺度化


为了对数据举行尺度化,必要从sklearn库中导入StandardScalar并将其使用于数据集。办法如下:


# data standardization with sklearn from sklearn.preprocessing importStandardScaler #numerical features num_cols= ['Item_Weight','Item_Visibility','Item_MRP','Outlet_Establishment_Year'] # applystandardization on numerical features for i in num_cols: # fit on trainingdata scale =StandardScaler().fit(X_train[[i]]) # transform thetraining data X_train_stand[i] = scale.transform(X_train_stand[[i]]) # transform thetesting data X_test_stand[i] = scale.transform(X_test_stand[[i]])


可以发明,只对数字列使用了尺度化,而没有对其他的单一热编码(One-HotEncoded)特性使用尺度化。尺度化单一热编码特性意味着将种别特性重新分布。你不会想这么做的!


但是为什么在对数据举行归一化时没有做异常的事变呢?由于单一热编码的特性已经在0到1之间了。以是,尺度化不会影响它们的值。


好的,来看看尺度化是怎样改动数据的:


如今,特性的值以均匀值为中央,具有单位尺度偏向分布。太棒了!


比力未缩放、归一化和尺度化的数据


可视化数据以了解以后分布总是很不错的。可以使用箱线图来比力未缩放数据和已缩放数据。


你会注意到,特性缩放思索到了方方面面。这些特性如今更具可比性,并且会对学习模子产生相似的影响。


将缩放使用于呆板学习算法


是时分在数据上练习一些呆板学习算法,以比力不同缩放武艺对算法功能的影响。特别注意缩放对三种算法的影响:K-近邻、支持向量回归和决定树。


K-近邻(KNN)


如前所述,KNN是一种基于距离的算法,受特性范围的影响。来看看缩放前后数据对功能的影响:


# training a KNN model from sklearn.neighbors importKNeighborsRegressor # measuring RMSE score from sklearn.metrics import mean_squared_error # knn knn=KNeighborsRegressor(n_neighbors=7) rmse= [] # raw,normalized and standardized training and testing data trainX= [X_train, X_train_norm, X_train_stand] testX= [X_test, X_test_norm, X_test_stand] # modelfitting and measuring RMSE for i inrange(len(trainX)): # fit knn.fit(trainX[i],y_train) # predict pred = knn.predict(testX[i]) # RMSE rmse.append(np.sqrt(mean_squared_error(y_test,pred))) #visualizing the result df_knn= pd.DataFrame({'RMSE':rmse},index=['Original','Normalized','Standardized']) df_knn


可以看到,特性缩放低落了KNN模子的RMSE分数。具体来说,归一化数据的功能比尺度化数据稍好一些。


注意:之以是丈量RMSE,由于这个比赛中评价RMSE。


图源:unsplash


支持向量回归(SVR)


SVR是另一种基于距离的算法。以是,来看看它是在归一照旧或尺度化的情况下事情得更好:


# training an SVR model from sklearn.svm importSVR # measuring RMSE score from sklearn.metrics import mean_squared_error # SVR svr=SVR(kernel='rbf',C=5) rmse= [] # raw,normalized and standardized training and testing data trainX= [X_train, X_train_norm, X_train_stand] testX= [X_test, X_test_norm, X_test_stand] # modelfitting and measuring RMSE for i inrange(len(trainX)): # fit svr.fit(trainX[i],y_train) # predict pred = svr.predict(testX[i]) # RMSE rmse.append(np.sqrt(mean_squared_error(y_test,pred))) #visualizing the result df_svr= pd.DataFrame({'RMSE':rmse},index=['Original','Normalized','Standardized']) df_svr


可以看到特性缩放的确低落了RMSE的分数。尺度化数据的体现优于归一化数据。为什么会如许呢?


sklearn文档标明,SVR使用RBF核,假定一切特性都以0为中央,方差相反。这是由于一个方差大于其他方差的特性会制止评价器从这些特性中学习。


决定树


已知特性缩放关于决定树没有影响。此处展现一个实例,展现决定树是怎样利用数据的:


# training a Decision Tree model from sklearn.tree importDecisionTreeRegressor # measuring RMSE score from sklearn.metrics import mean_squared_error #Decision tree dt=DecisionTreeRegressor(max_depth=10,random_state=27) rmse= [] # raw,normalized and standardized training and testing data trainX= [X_train,X_train_norm,X_train_stand] testX= [X_test,X_test_norm,X_test_stand] # modelfitting and measuring RMSE for i inrange(len(trainX)): # fit dt.fit(trainX[i],y_train) # predict pred = dt.predict(testX[i]) # RMSE rmse.append(np.sqrt(mean_squared_error(y_test,pred))) #visualizing the result df_dt= pd.DataFrame({'RMSE':rmse},index=['Original','Normalized','Standardized']) df_dt


可以看到,RMSE分数在特性缩放时并一点也没变。因此,可以安心在数据上使用基于树的算法!


图源:unsplash


要记取的是,何时使用归一化照旧尺度化永久没有尺度答案。这完全取决于数据和使用的算法。接下去轮到你了,试试用其他算法举行特性缩放吧。


留言点赞存眷

我们一同分享AI学习与展开的干货

如转载,请背景留言,恪守转载标准

内容底部广告位(手机)
标签:

管理员
草根站长管理员

专注网站优化+网络营销,只做有思想的高价值网站,只提供有担当的营销服务!

上一篇:app制作(从零开始制作手机app应用程序:基本步骤和指导)
下一篇:返回列表

相关推荐