python离群点检测_合成特征和离群值(接上篇的补充)

Apple iPhone 11 (A2223) 128GB 黑色 移动联通电信4G手机 双卡双待

4999元包邮

去购买 >

iphone.jpg

合成特征和离群值

学习目标:

尝试合成特征

上一次我们只使用了单个特征,但这是不切实际的,往往我们需要多个特征,但此次并不是使用多个特征,而是创建一个合成特诊

total_rooms 和 population 特征都会统计指定街区的相关总计数据。

但是,如果一个街区比另一个街区的人口更密集,会怎么样?我们可以创建一个合成特征(即 total_rooms 与 population 的比例)来探索街区人口密度与房屋价值中位数之间的关系。

# 创建合成特征

california_housing_dataframe["rooms_per_person"] =california_housing_dataframe["total_rooms"]/california_housing_dataframe["population"]

calibration_data = train_model(

learning_rate=0.0005,

steps=500,

batch_size=1,

input_feature="rooms_per_person"

)

结果:

Training model...

RMSE (on training data):

period 00 : 237.29

period 01 : 237.04

period 02 : 236.78

period 03 : 236.53

period 04 : 236.28

period 05 : 236.03

period 06 : 235.78

period 07 : 235.53

period 08 : 235.27

period 09 : 235.02

Model training finished

效果很差,因为RMSE变化很小,我们可以尝试增大学习速率,*10 learning_rate=0.005

Training model...

RMSE (on training data):

period 00 : 235.03

period 01 : 232.52

period 02 : 230.03

period 03 : 227.56

period 04 : 225.13

period 05 : 222.70

period 06 : 220.38

period 07 : 217.95

period 08 : 215.54

period 09 : 213.17

Model training finished.

可以发现RMSE是在逐渐收敛的,学习速率没有过大,继续*10 learning_rate=0.05

Training model...

RMSE (on training data):

period 00 : 212.86

period 01 : 190.91

period 02 : 172.64

period 03 : 155.99

period 04 : 149.72

period 05 : 141.27

period 06 : 136.94

period 07 : 134.30

period 08 : 131.94

period 09 : 130.69

Model training finished.

1460000013822855?w=1061&h=420

从RMSE的下降速率来看,说明已经接近最小值了,为其增大一点点,+0.005 learning_rate=0.055

Training model...

RMSE (on training data):

period 00 : 210.61

period 01 : 185.76

period 02 : 166.58

period 03 : 150.86

period 04 : 142.97

period 05 : 136.05

period 06 : 133.06

period 07 : 132.46

period 08 : 131.34

period 09 : 130.55

Model training finished.

predictions

targets

count

17000.0

17000.0

mean

170.9

207.3

std

77.4

116.0

min

41.1

15.0

25%

140.6

119.4

50%

168.3

180.4

75%

191.9

265.0

max

3693.8

500.0

Final RMSE (on training data): 130.55

1460000013822856

可以发现结果变化很小,我们在这里就可以停止了,因为再次尝试下去,要浪费太多的计算量和时间

识别离群值

通过上图的预测值与目标值的散点图效果,可以发现,

如果是在理想情况下,这些值将位于一条完全相关的对角线上。

但是现在却是存在许多异常的散点,如果我们能够查找到这些异常点的原因并将其筛除掉,那么效果一定会更好更贴近真实情况

# 尺寸15*6

plt.figure(figsize=(15, 6))

# 1行2列,先画第一个格

plt.subplot(1, 2, 1)

# x,y轴标签

plt.xlabel("predictioon")

plt.ylabel("targets")

# 绘制散点图

plt.scatter(calibration_data["predictions"], calibration_data["targets"])

# 第二个绘制直方图

plt.subplot(1, 2, 2)

california_housing_dataframe["rooms_per_person"].hist()

结果:

1460000013822857?w=889&h=371

从散点图中可以看出,绝大部分的散点汇集在一条竖直的直线上(其实这也并不是一条直线,而是因为x轴的分辨率太大了,一格500),还有一些是散乱分布的

为什么大部分点会垂直排列,这个原因我们先不讲,这不是这次训练目的,我们的目的是要找出极少出的异常的点

再看直方图,大部分是在0-5这条线上,少数的应该就是异常值了,下面我们滤掉他们,并看下结果会怎样

california_housing_dataframe["rooms_per_person"] = (

california_housing_dataframe["rooms_per_person"]).apply(lambda x: min(x, 5))

_ = california_housing_dataframe["rooms_per_person"].hist()

结果:

1460000013822858?w=490&h=330

这次都在0-5之内了

再次训练

calibration_data = train_model(

learning_rate=0.055,

steps=500,

batch_size=5,

input_feature="rooms_per_person")

结果:

Training model...

RMSE (on training data):

period 00 : 210.41

period 01 : 184.47

period 02 : 160.39

period 03 : 140.40

period 04 : 124.11

period 05 : 117.53

period 06 : 110.61

period 07 : 108.84

period 08 : 108.26

period 09 : 108.65

Model training finished.

predictions

targets

count

17000.0

17000.0

mean

191.6

207.3

std

50.1

116.0

min

44.8

15.0

25%

159.7

119.4

50%

191.7

180.4

75%

218.9

265.0

max

425.3

500.0

Final RMSE (on training data): 108.65

1460000013822859?w=1061&h=420

这次的结果好过以前的每一次,体现在RMSE下降的速度特别快,说明少了很多干扰,其次便是RMSE这次是最小的,说明去除离群值后效果真的是好了很多

plt.scatter(calibration_data["predictions"], calibration_data["targets"])

结果:

1460000013822860

现在可以看出散点分布其实是挺集中的。

以上,结束

原文链接:https://segmentfault.com/a/1190000013822850

jd_dn250.png

jd_sj250.jpg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值