Udacity机器学习入门——特征缩放

Chirs体重+身高=146.1 

Caneron体重+身高=180.9 

Serah 体重+身高=120.2                  

从数据上看Chirs与S数值更接近,应该穿S大小衣服,但是由于体重和身高的度量标准差异(一个是个位数,一个是百位数)导致体重占据了主导位置,此时就用到特征缩放,使这些特征跨越的范围有可比性,通常是在0和1之间(包含0、1)

特征缩放的一个优点是预估输出相对稳定,缺点是当有异常值时,max或min可能会是极端值


通过特征缩放Chirs的体重特征 值缩放为0.417

编写代码计算特征缩放值

def featureScaling(arr):
    scaler_list=[]
    if max(arr)==min(arr):
        for i in range(0,len(arr)):
             scaler_list.append(0.5)
        return scaler_list
    else:
        for i in range(0,len(arr)):
            scaler =(float)(arr[i]-min(arr))  / ( max(arr)-min(arr))
            scaler_list.append(scaler)
        return scaler_list

# tests of your feature scaler--line below is input data
data = [115, 140, 175]
print featureScaling(data)

实际上在sklearn中有代码能够实现:

>>>from sklearn.preprocessing import MinMaxScaler
>>>import numpy
>>>weights = numpy.array([[115.],[140.],[175.]])#需要浮点数
>>>scaler = MinMaxScaler()
>>>rescaled_weight = scaler.fit_transform(weights)
array([[0.        ],
       [0.41666667],
       [1.        ]])

扫描二维码关注公众号,回复: 194245 查看本文章

不会受特征缩放影响的算法:线性回归、决策树

会受到影响的算法:使用RBF核函数的SVM、K-均值聚类

SVM和K-均值聚类在计算距离时,是在利用一个维度与另一个维度进行交换,例如把某一点增加一倍,那么它的值也会扩大一倍

K-means同理

决策树:会呈现出一系列的水平线和垂线,不存在两者的交换,只是在不同的方向上进行切割,在处理某一维度时不需要考虑另一个维度的情况。例如方框缩小一半即特征缩放,图中线条的位置会有所变化,但是分割顺序是一样的.它是按比例分割的,所以两个变量之间不存在交换.

线性回归:每个特征都有一个系数,这个系数总是与相应的特征同时出现,特征A的变化不会影响到特征B的系数(另外如果变量扩大一倍,那它的特征会缩小1/2,其结果不变)


特征缩放迷你项目

1.回顾 K-均值聚类迷你项目最后一部分。分析出我们使用的是哪类缩放。    MinMaxScaler

2.原值为 200,000 的“salary”特征在尺度变换后的值会是什么,以及原值为 100 万美元的“exercised_stock_options”特征在尺度变换后的值会是什么?两个计算方式有误差

普通计算:

100万的“exercised_stock_options”特征缩放值: 0.0290205889347

20万的“salary”特征缩放值: 0.17962406631

MaxMinScaler计算

100万的“exercised_stock_options”特征缩放值:[ 0.02911624]
20万的“salary”特征缩放值: [ 0.18005349]
stocklist = []
salarylist = []
for item in data_dict:
    stock = data_dict[item]['exercised_stock_options']
    salary = data_dict[item]['salary']
    if stock != 'NaN':
        stocklist.append(stock)
    if salary != 'NaN':
        salarylist.append(salary)

from  sklearn.preprocessing import MinMaxScaler
import numpy as np

salarylist = np.array(salarylist).reshape(-1,1)
stocklist = np.array(stocklist).reshape(-1,1)
#普通方法计算特征缩放
print '100万的“exercised_stock_options”特征缩放值:' ,(1000000.0 - np.min(stocklist))/(np.max(stocklist)-np.min(stocklist))
print '20万的“salary”特征缩放值:',(200000.0 - np.min(salarylist))/(np.max(salarylist)-np.min(salarylist))

min_max_scaler = MinMaxScaler()
min_max_scaler.fit_transform(stocklist)
print 1000000.0 * min_max_scaler.scale_ #原始值*缩放因子
min_max_scaler.fit_transform(salarylist)
print 200000.0 * min_max_scaler.scale_

3.如果我们想基于“from_messages”(从一个特定的邮箱帐号发出的电子邮件数)和“salary”来进行集群化会怎样? 在这种情形下,特征缩放是不必要的,还是重要的?

重要。电子邮件的数量通常在几百或几千的人,工资通常至少高出1000倍。




猜你喜欢

转载自blog.csdn.net/u012084802/article/details/80100357