-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.xml
2238 lines (2048 loc) · 386 KB
/
index.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Reid's Blog</title>
<link>https://reid00.github.io/</link>
<description>Recent content on Reid's Blog</description>
<generator>Hugo -- gohugo.io</generator>
<language>zh-cn</language>
<lastBuildDate>Fri, 04 Aug 2023 11:53:15 +0800</lastBuildDate><atom:link href="https://reid00.github.io/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Hugo搭建博客并用GitHubAction部署</title>
<link>https://reid00.github.io/posts/other/hugo%E6%90%AD%E5%BB%BA%E5%8D%9A%E5%AE%A2%E5%B9%B6%E7%94%A8githubaction%E9%83%A8%E7%BD%B2/</link>
<pubDate>Thu, 16 Mar 2023 19:35:03 +0800</pubDate>
<guid>https://reid00.github.io/posts/other/hugo%E6%90%AD%E5%BB%BA%E5%8D%9A%E5%AE%A2%E5%B9%B6%E7%94%A8githubaction%E9%83%A8%E7%BD%B2/</guid>
<description>介绍 这是我博客 Blog 的地址 和 Github Repositroy。
本博客是用Hugo 来生成静态网站。 Hugo GitHub
并通过 GitHub Action 来自动化部署到 GitHub Pages。
搭建步骤 创建代码仓库 首先按照文档创建 GitHub Pages 站点。该仓库可见性必须是 Public。
另外创建一个仓库用来存放 Hugo 的源文件,名称随意,这里假设仓库名叫 .github.io.source。建议将仓库可见性设置成 Private 以保护好你的源代码。
创建完毕后你的账户下将存在以下两个代码仓库:
https://github.com/&lt;YourName&gt;/&lt;YourName&gt;.github.io (公开的)
https://github.com/&lt;YourName&gt;/&lt;YourName&gt;.github.io.source(私有的)
生成Hugo 网站 安装Hugo For Windows
到Github Release 下载最新版本,用hugo version 或者extended version (部分主题需要extended version 才能使用)
安装步骤参考官方提供
在C盘新建Hugo/sites 目录用于 生成hugo 项目
在C盘新建Hugo/bin 目录,用来存放上面解压后的hugo 二进制文件
添加C:\Hugo\bin 到系统环境变量中
添加完成后,在cmd 或者其他console 中输入hugo version检查 环境变量是否添加成功。
出现下面的表示成功。注意:环境变量添加成功后,记得重启console
For mac/linux
可以只用用命令下载,此处不多讲了。
Hugo 生成网站 在/c/Hugo/sites 目录下使用命令hugo new site siteName生成网站</description>
</item>
<item>
<title>IO 多路复用</title>
<link>https://reid00.github.io/posts/os_network/io-%E5%A4%9A%E8%B7%AF%E5%A4%8D%E7%94%A8/</link>
<pubDate>Fri, 04 Aug 2023 11:53:15 +0800</pubDate>
<guid>https://reid00.github.io/posts/os_network/io-%E5%A4%9A%E8%B7%AF%E5%A4%8D%E7%94%A8/</guid>
<description>最基本的 Socket 模型 要想客户端和服务器能在网络中通信,那必须得使用 Socket 编程,它是进程间通信里比较特别的方式,特别之处在于它是可以跨主机间通信。
Socket 的中文名叫作插口,咋一看还挺迷惑的。事实上,双方要进行网络通信前,各自得创建一个 Socket,这相当于客户端和服务器都开了一个“口子”,双方读取和发送数据的时候,都通过这个“口子”。这样一看,是不是觉得很像弄了一根网线,一头插在客户端,一头插在服务端,然后进行通信。
创建 Socket 的时候,可以指定网络层使用的是 IPv4 还是 IPv6,传输层使用的是 TCP 还是 UDP。
UDP 的 Socket 编程相对简单些,这里我们只介绍基于 TCP 的 Socket 编程。
服务器的程序要先跑起来,然后等待客户端的连接和数据,我们先来看看服务端的 Socket 编程过程是怎样的。
服务端首先调用 socket() 函数,创建网络协议为 IPv4,以及传输协议为 TCP 的 Socket ,接着调用 bind() 函数,给这个 Socket 绑定一个 IP 地址和端口,绑定这两个的目的是什么?
绑定端口的目的:当内核收到 TCP 报文,通过 TCP 头里面的端口号,来找到我们的应用程序,然后把数据传递给我们。 绑定 IP 地址的目的:一台机器是可以有多个网卡的,每个网卡都有对应的 IP 地址,当绑定一个网卡时,内核在收到该网卡上的包,才会发给我们; 绑定完 IP 地址和端口后,就可以调用 listen() 函数进行监听,此时对应 TCP 状态图中的 listen,如果我们要判定服务器中一个网络程序有没有启动,可以通过 netstat 命令查看对应的端口号是否有被监听。
服务端进入了监听状态后,通过调用 accept() 函数,来从内核获取客户端的连接,如果没有客户端连接,则会阻塞等待客户端连接的到来。
那客户端是怎么发起连接的呢?客户端在创建好 Socket 后,调用 connect() 函数发起连接,该函数的参数要指明服务端的 IP 地址和端口号,然后万众期待的 TCP 三次握手就开始了。</description>
</item>
<item>
<title>操作系统之文件系统</title>
<link>https://reid00.github.io/posts/os_network/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E4%B9%8B%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F/</link>
<pubDate>Sun, 23 Apr 2023 14:04:18 +0800</pubDate>
<guid>https://reid00.github.io/posts/os_network/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E4%B9%8B%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F/</guid>
<description>文件系统 文件系统是操作系统中负责管理持久数据的子系统,说简单点,就是负责把用户的文件存到磁盘硬件中,因为即使计算机断电了,磁盘里的数据并不会丢失,所以可以持久化的保存文件。
文件系统的基本数据单位是文件,它的目的是对磁盘上的文件进行组织管理,那组织的方式不同,就会形成不同的文件系统。
Linux 最经典的一句话是:「一切皆文件」,不仅普通的文件和目录,就连块设备、管道、socket 等,也都是统一交给文件系统管理的。
Linux 文件系统会为每个文件分配两个数据结构:Inode(index node)和目录项(directory entry),它们主要用来记录文件的元信息和目录层次结构。
Inode,也就是inode,用来记录文件的元信息,比如 inode 编号、文件大小、访问权限、创建时间、修改时间、数据在磁盘的位置等等。Inode是文件的唯一标识,它们之间一一对应,也同样都会被存储在硬盘中,所以Inode同样占用磁盘空间。
目录项,也就是dentry,用来记录文件的名字、Inode指针以及与其他目录项的层级关联关系。多个目录项关联起来,就会形成目录结构,但它与Inode不同的是,目录项是由内核维护的一个数据结构,不存放于磁盘,而是缓存在内存。
由于Inode唯一标识一个文件,而目录项记录着文件的名,所以目录项和Inode的关系是多对一,也就是说,一个文件可以有多个目录。比如,硬链接的实现就是多个目录项中的Inode指向同一个文件。
注意,目录也是文件,也是用Inode唯一标识,和普通文件不同的是,普通文件在磁盘里面保存的是文件数据,而目录文件在磁盘里面保存子目录或文件。
目录项和目录是一个东西吗? 虽然名字很相近,但是它们不是一个东西,目录是个文件,持久化存储在磁盘,而目录项是内核一个数据结构,缓存在内存。
如果查询目录频繁从磁盘读,效率会很低,所以内核会把已经读过的目录用目录项这个数据结构缓存在内存,下次再次读到相同的目录时,只需从内存读就可以,大大提高了文件系统的效率。
注意,目录项这个数据结构不只是表示目录,也是可以表示文件的。
## 文件数据是如何存储在磁盘的呢? 磁盘读写的最小单位是扇区,扇区的大小只有 512字节,那么如果数据大于512字节时候,磁盘需要不停地移动磁头来查找数据,我们知道一般的文件很容易超过512字节那么如果把多个扇区合并为一个块,那么磁盘就可以提高效率了。那么磁头一次读取多个扇区就为一个块“block”(Linux上称为块,Windows上称为簇)。所以,文件系统把多个扇区组成了一个逻辑块,每次读写的最小单位就是逻辑块(数据块),Linux 中的逻辑块大小为 4KB,也就是一次性读写 8 个扇区,这将大大提高了磁盘的读写的效率。 sector size &lt;= block size &lt;= memory page size
文件系统记录的数据,除了其自身外,还有数据的权限信息,所有者等属性,这些信息都保存在inode中,那么谁来记录inode信息和文件系统本身的信息呢,比如说文件系统的格式,inode与data的数量呢?那么就有一个超级区块(supper block)来记录这些信息了。
superblock:记录此 filesystem 的整体信息,包括inode/block的总量、使用量、剩余量, 以及文件系统的格式与相关信息等 inode:记录文件的属性信息,可以使用stat命令查看inode信息。 block:实际文件的内容,如果一个文件大于一个块时候,那么将占用多个block,但是一个块只能存放一个文件。(因为数据是由inode指向的,如果有两个文件的数据存放在同一个块中,就会乱套了) Inode用来指向数据block,那么只要找到inode,再由inode找到block编号,那么实际数据就能找出来了。
Inode是存储在硬盘上的数据,为了加速文件的访问,通常会把Inode加载到内存中。我们不可能把超级块和Inode区全部加载到内存,这样内存肯定撑不住,所以只有当需要使用的时候,才将其加载进内存,它们加载进内存的时机是不同的:
超级块:当文件系统挂载时进入内存; Inode区:当文件被访问时进入内存; 虚拟文件系统 文件系统的种类众多,而操作系统希望对用户提供一个统一的接口,于是在用户层与文件系统层引入了中间层,这个中间层就称为虚拟文件系统(Virtual File System,VFS)。VFS 定义了一组所有文件系统都支持的数据结构和标准接口,这样程序员不需要了解文件系统的工作原理,只需要了解 VFS 提供的统一接口即可。在 Linux 文件系统中,用户空间、系统调用、虚拟机文件系统、缓存、文件系统以及存储之间的关系如下图: Linux 支持的文件系统也不少,根据存储位置的不同,可以把文件系统分为三类:
磁盘的文件系统,它是直接把数据存储在磁盘中,比如 Ext 2/3/4、XFS 等都是这类文件系统。 内存的文件系统,这类文件系统的数据不是存储在硬盘的,而是占用内存空间,我们经常用到的/proc 和 /sys 文件系统都属于这一类,读写这类文件,实际上是读写内核中相关的数据。 网络的文件系统,用来访问其他计算机主机数据的文件系统,比如 NFS、SMB 等等。 文件系统首先要先挂载到某个目录才可以正常使用,比如 Linux 系统在启动时,会把文件系统挂载到根目录。</description>
</item>
<item>
<title>操作系统之内存管理</title>
<link>https://reid00.github.io/posts/os_network/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E4%B9%8B%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/</link>
<pubDate>Thu, 13 Apr 2023 15:32:55 +0800</pubDate>
<guid>https://reid00.github.io/posts/os_network/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E4%B9%8B%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/</guid>
<description>什么是内存 最直观的,我们买手机,电脑,内存条,都会标明内存是多大,例如途中的8G,16G,128G都指的内存大小。 我们应该都听说过 RAM 存储器,它是一种半导体存储器件。RAM 是英文单词 Random Access Memory 的缩写,即“随机”的意思。所以 RAM 存储器也称为“随机存储器”。
那么 RAM 存储器和内存有什么关系呢?内存就是许多 RAM 存储器的集合,就是将许多 RAM 存储器集成在一起的电路板。RAM 存储器的优点是存取速度快、读写方便,所以内存的速度当然也就快了。
操作系统发展历史 稍微了解操作系统历史的人,都知道没有操作系统的裸机-&gt;一次只能运行一个程序的单道批处理系统-&gt;多道批处理系统-&gt;分时系统这个发展历程。
裸机时代 主要是人工操作,程序员将对应用程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制台开关启动程序针对数据运行;计算完毕,打印机输出计算结果;用户取走结果并卸下纸带(或卡片)后,才让下一个用户上机。
人机矛盾:手工操作的慢速度和计算机的高速度之间形成了尖锐矛盾,手工操作方式已严重损害了系统资源的利用率(使资源利用率降为百分之几,甚至更低),不能容忍。唯一的解决办法:只有摆脱人的手工操作,实现作业的自动过渡。这样就出现了成批处理。
单道批处理系统 特点是一次只能运行一个进程,只有运行完毕后才能将下一个进程加载到内存里面,所以进程的数据都是直接放在物理内存上的,因此CPU是直接操作内存的物理地址,这个时候不存在虚拟逻辑地址,因为一次只能运行一个程序。
矛盾:每次主机内存中仅存放一道作业,每当它运行期间发出输入/输出(I/O)请求后,高速的CPU便处于等待低速的I/O完成状态,致使CPU空闲。
多道批处理系统 到后来发展出了多道程序系统,它要求在计算机中存在着多个进程,处理器需要在多个进程间进行切换,当一道程序因I/O请求而暂停运行时,CPU便立即转去运行另一道程序。
问题来了,这么多进程,内存不够用怎么办,各个进程同时运行时内存地址互相覆盖怎么办?
这时候就出现问题了,链接器在链接一个可执行文件的时候,总是默认程序的起始地址为0x0,但物理内存上只有一个0x0的地址呀?也许你会说:”没关系,我们可以在程序装入内存的时候再次动态改变它的地址.”好吧我忍了。但如果我的物理内存大小只有1G,而现在某一个程序需要超过1G的空间怎么办呢?你还能用刚才那句话解释吗?
操作系统的发展,包括后面的分时系统,其实都是在解决协调各个环节速度不匹配的矛盾。
CPU比磁盘速度快太多 存储器层次之间的作用和关联为金字塔形状,CPU不可以直接操控磁盘,是通过操控内存来进行工作的,因为磁盘的速度远远小于CPU的速度,跟不上,需要中间的内存层进行缓冲。
内存速度比硬盘速度快的原理: 内存的速度之所以比硬盘的速度快(不是快一点,而是快很多),是因为它们的存储原理和读取方式不一样。
硬盘是机械结构,通过磁头的转动读取数据。一般情况下台式机的硬盘为每分钟 7200 转,而笔记本的硬盘为每分钟 5400 转。 而内存是没有机械结构的,内存是通过电存取数据的。
内存通过电存取数据,本质上就是因为 RAM 存储器是通过电存储数据的。但也正因为它们是通过电存储数据的,所以一旦断电数据就都丢失了。因此内存只是供数据暂时逗留的空间,而硬盘是永久的,断电后数据也不会消失。
小结:程序执行前需要先放到内存中才能被CPU处理,因此内存的主要作用就是缓和CPU与硬盘之间的速度矛盾。
程序运行过程 在多道程序环境下,系统中会有多个程序并发执行,也就是说会有多个程序的数据需要同时放到内存中。那么,如何区分各个程序的数据是放在什么地方的呢?
方案: 给内存的存储单元编地址。 程序运行过程如下: 编译: 把高级语言翻译为机器语言;
链接: 由链接程序将编译后形成的一组目标模块,以及所需库函数链接在一起,形成一个完整的装入模块;
装入(装载): 由装入程序将装入模块装入内存运行; 三种链接方式 静态链接 在程序运行之前,先将各目标模块及它们所需的库函数链接成一个完整的可执行文件(装入模块),即得到完整的逻辑地址,之后不再拆开。 装入时动态链接 运行前边装入边链接的链接方式。 运行时动态链接 运行时该目标模块时,才对它进行链接,用不到的模块不需要装入内存。其优点是便于修改和更新,便于实现对目标模块的共享。 可以看到运行时动态链接,不需要一次性将模块全部装入内存,可以等到运行时需要的时候再动态的连接进去,这样一来就就提供了内存不够用的问题的解决思路,还可以这样,用到了再链接进去
三种装入方式 绝对装入 编译或汇编时得到绝对地址,即内存物理地址,直接存到对应的物理地址。 单道处理系统就是直接操作物理地址,因此绝对装入只适用于单道程序环境。</description>
</item>
<item>
<title>集成学习之xgboost</title>
<link>https://reid00.github.io/posts/ml/%E9%9B%86%E6%88%90%E5%AD%A6%E4%B9%A0%E4%B9%8Bxgboost/</link>
<pubDate>Thu, 16 Mar 2023 19:35:28 +0800</pubDate>
<guid>https://reid00.github.io/posts/ml/%E9%9B%86%E6%88%90%E5%AD%A6%E4%B9%A0%E4%B9%8Bxgboost/</guid>
<description>一、XGBoost和GBDT xgboost是一种集成学习算法,属于3类常用的集成方法(bagging,boosting,stacking)中的boosting算法类别。它是一个加法模型,基模型一般选择树模型,但也可以选择其它类型的模型如逻辑回归等。
xgboost属于梯度提升树(GBDT)模型这个范畴,GBDT的基本想法是让新的基模型(GBDT以CART分类回归树为基模型)去拟合前面模型的偏差,从而不断将加法模型的偏差降低。
相比于经典的GBDT,xgboost做了一些改进,从而在效果和性能上有明显的提升(划重点面试常考)。
第一,GBDT将目标函数泰勒展开到一阶,而xgboost将目标函数泰勒展开到了二阶。保留了更多有关目标函数的信息,对提升效果有帮助。
第二,GBDT是给新的基模型寻找新的拟合标签(前面加法模型的负梯度),而xgboost是给新的基模型寻找新的目标函数(目标函数关于新的基模型的二阶泰勒展开)。
第三,xgboost加入了和叶子权重的L2正则化项,因而有利于模型获得更低的方差。
**第四,xgboost增加了自动处理缺失值特征的策略。**通过把带缺失值样本分别划分到左子树或者右子树,比较两种方案下目标函数的优劣,从而自动对有缺失值的样本进行划分,无需对缺失特征进行填充预处理。
此外,xgboost还支持候选分位点切割,特征并行等,可以提升性能。
二、XGBoost原理概述 面从假设空间,目标函数,优化算法3个角度对xgboost的原理进行概括性的介绍。
1,假设空间
2,目标函数
3,优化算法
基本思想:贪心法,逐棵树进行学习,每棵树拟合之前模型的偏差。
三、第t棵树学什么? 要完成构建xgboost模型,我们需要确定以下一些事情。
1,如何boost? 如果已经得到了前面t-1棵树构成的加法模型,如何确定第t棵树的学习目标?
2,如何生成树?已知第t棵树的学习目标的前提下,如何学习这棵树?具体又包括是否进行分裂?选择哪个特征进行分裂?选择什么分裂点位?分裂的叶子节点如何取值?
我们首先考虑如何boost的问题,顺便解决分裂的叶子节点如何取值的问题。
四、如何生成第t棵树? xgboost采用二叉树,开始的时候,全部样本都在一个叶子节点上。然后叶子节点不断通过二分裂,逐渐生成一棵树。
xgboost使用levelwise的生成策略,即每次对同一层级的全部叶子节点尝试进行分裂。
对叶子节点分裂生成树的过程有几个基本的问题:是否要进行分裂?选择哪个特征进行分裂?在特征的什么点位进行分裂?以及分裂后新的叶子上取什么值?
叶子节点的取值问题前面已经解决了。我们重点讨论几个剩下的问题。
1,是否要进行分裂? 根据树的剪枝策略的不同,这个问题有两种不同的处理。如果是预剪枝策略,那么只有当存在某种分裂方式使得分裂后目标函数发生下降,才会进行分裂。
但如果是后剪枝策略,则会无条件进行分裂,等树生成完成后,再从上而下检查树的各个分枝是否对目标函数下降产生正向贡献从而进行剪枝。
xgboost采用预剪枝策略,只有分裂后的增益大于0才会进行分裂。
2,选择什么特征进行分裂?
xgboost采用特征并行的方法进行计算选择要分裂的特征,即用多个线程,尝试把各个特征都作为分裂的特征,找到各个特征的最优分割点,计算根据它们分裂后产生的增益,选择增益最大的那个特征作为分裂的特征。
3,选择什么分裂点位?
xgboost选择某个特征的分裂点位的方法有两种,一种是全局扫描法,另一种是候选分位点法。 全局扫描法将所有样本该特征的取值按从小到大排列,将所有可能的分裂位置都试一遍,找到其中增益最大的那个分裂点,其计算复杂度和叶子节点上的样本特征不同的取值个数成正比。 而候选分位点法是一种近似算法,仅选择常数个(如256个)候选分裂位置,然后从候选分裂位置中找出最优的那个。
五、XGBoost算法原理小结 XGBoost(eXtreme Gradient Boosting)全名叫极端梯度提升,XGBoost是集成学习方法的王牌,在Kaggle数据挖掘比赛中,大部分获胜者用了XGBoost,XGBoost在绝大多数的回归和分类问题上表现的十分顶尖,本文较详细的介绍了XGBoost的算法原理。
目录
最优模型的构建方法
Boosting的回归思想
XGBoost的目标函数推导
XGBoost的回归树构建方法
XGBoost与GDBT的区别
最优模型的构建方法
构建最优模型的一般方法是最小化训练数据的损失函数,我们用字母 L表示,如下式:
式(1)称为经验风险最小化,训练得到的模型复杂度较高。当训练数据较小时,模型很容易出现过拟合问题。
因此,为了降低模型的复杂度,常采用下式:
其中J(f)为模型的复杂度,式(2)称为结构风险最小化,结构风险最小化的模型往往对训练数据以及未知的测试数据都有较好的预测 。
应用:决策树的生成和剪枝分别对应了经验风险最小化和结构风险最小化,XGBoost的决策树生成是结构风险最小化的结果,后续会详细介绍。
Boosting方法的回归思想
Boosting法是结合多个弱学习器给出最终的学习结果,不管任务是分类或回归,我们都用回归任务的思想来构建最优Boosting模型 。
回归思想:把每个弱学习器的输出结果当成连续值,这样做的目的是可以对每个弱学习器的结果进行累加处理,且能更好的利用损失函数来优化模型。
假设
是第 t 轮弱学习器的输出结果,
是模型的输出结果,
是实际输出结果,表达式如下:
上面两式就是加法模型,都默认弱学习器的输出结果是连续值。因为回归任务的弱学习器本身是连续值,所以不做讨论,下面详细介绍分类任务的回归思想。
分类任务的回归思想:
根据2.1式的结果,得到最终的分类器:
分类的损失函数一般选择指数函数或对数函数,这里假设损失函数为对数函数,学习器的损失函数是
若实际输出结果yi=1,则:
求(2.5)式对</description>
</item>
<item>
<title>集成学习之AdaBoost</title>
<link>https://reid00.github.io/posts/ml/%E9%9B%86%E6%88%90%E5%AD%A6%E4%B9%A0%E4%B9%8Badaboost/</link>
<pubDate>Thu, 16 Mar 2023 19:35:27 +0800</pubDate>
<guid>https://reid00.github.io/posts/ml/%E9%9B%86%E6%88%90%E5%AD%A6%E4%B9%A0%E4%B9%8Badaboost/</guid>
<description>Boosting算法的工作机制 用初始权重D(1)从数据集中训练出一个弱学习器1 根据弱学习1的学习误差率表现来更新训练样本的权重D(2),使得之前弱学习器1学习误差率高的样本点的权重变高,使得这些误差率高的点在后面的弱学习器2中得到更多的重视。 然后基于调整权重后的训练集来训练弱学习器2 如此重复进行,直到弱学习器数达到事先指定的数目T,最终将这T个弱学习器通过集合策略进行整合,得到最终的强学习器。 现如今已经有很多的提升方法了,但最著名的就是Adaboost(适应性提升,是Adaptive Boosting的简称)和Gradient Boosting(梯度提升)。让我们先从 Adaboost 说起。
什么是AdaBoost AdaBoost是一个具有里程碑意义的算法,其中,适应性(adaptive)是指:后续的分类器为更好地支持被先前分类器分类错误的样本实例而进行调整。通过对之前分类结果不对的训练实例多加关注,使新的预测因子越来越多地聚焦于之前错误的情况。
具体说来,整个AdaBoost迭代算法就3步:
初始化训练数据的权值分布。如果有N个样本,则每一个训练样本最开始时都被赋予相同的权值:。 训练弱分类器。具体训练过程中,如果某个样本点已经被准确地分类,那么在构造下一个训练集中,它的权值就被降低;相反,如果某个样本点没有被准确地分类,那么它的权值就得到提高。然后,权值更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代地进行下去。 将各个训练得到的弱分类器组合成强分类器。各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。换言之,误差率低的弱分类器在最终分类器中占的权重较大,否则较小。 加法模型与前向分布 在学习AdaBoost之前需要了解两个数学问题,这两个数学问题可以帮助我们更好地理解AdaBoost算法,并且在面试官问你算法原理时不至于发懵。下面我们就来看看加法模型与前向分布。
什么是加法模型 当别人问你“什么是加法模型”时,你应当知道:加法模型顾名思义就是把各种东西加起来求和。如果想要更严谨的定义,不妨用数学公式来表达: 这个公式看上去可能有些糊涂,如果我们套用到提升树模型中就比较容易理解一些。FM(x)表示最终生成的最好的提升树,其中M表示累加的树的个数。b(x;ym)表示一个决策树,$阿尔法m$ 表示第m个决策树的权重,ym表示决策树的参数(如叶节点的个数)。
什么是前向分布 那么什么是前向分布算法呢?在损失函数的条件下,加法模型FM(x)成为一个经验风险极小化问题,即使得损失函数极小化: 前向分布算法就是求解这个优化问题的一个思想:因为学习的是加法模型,如果能够从前向后,每一步只学习一个基函数(一棵决策树)及其权重,利用残差逐步逼近优化问题,那么就可以简化优化的复杂度。从而得到前向分布算法为:
套用在提升树模型中进行理解就是:$fm-1(x)$是前一棵提升树(之前树的累加),在其基础上再加上一棵树$Bxi, Ym$乘上它的权重系数,用这棵树去拟合的残差!$阿尔法m$(观察值与估计值之间的差),再将这两棵树合在一起就得到了新的提升树。实际上就是让下一个基分类器去拟合当前分类器学习出来的残差。
前向分布与Adaboost损失函数优化的关系 现在了解了加法模型与前向分布。那这两个概念与Adaboost又有什么关系呢?
Adaboost可以认为其模型是加法模型、损失函数为指数函数、学习算法为前向分步算法的二类分类学习方法。我们可以使用前向分布算法作为框架,推导出Adaboost算法的损失函数优化问题的。
在Adaboost中,各个基本分类器就相当于加法模型中的基函数$fm-1(x)$,且其损失函数为指数函数$b(xi;ym)$。
即,需要优化的问题如下: 如果我们令,则上述公式可以改写成为: 因为与要么相等、要么不等。所以可以将其拆成两部分相加的形式:
算法中需要关注的内容 首先看看算法中都关注了哪些内容: 首先,我们假设训练样本为$(x1,y1), (x2, y2)&hellip;(xn, yn)$
由于AdaBoost是由一个个的弱分类器迭代训练得到一个强分类器的,因此我们有如下定义:
弱分类器表达式:$Ht(x)$ 先以二分类为例,它输出的值为1或-1,则有:$Ht(x) ∈{-1, 1}$
首先,我们假设训练样本为
由于AdaBoost是由一个个的弱分类器迭代训练得到一个强分类器的,因此我们有如下定义:
弱分类器表达式: 公式推导(通过Z最小化训练误差) Adaboost算法之所以称为十大算法之一,有一个重要原因就是它有完美的数学推导过程,其参数不是人工设定的,而是有解析解的,并且可以证明其误差上界越来越小,趋近于零;且可以推导出来。下面就来看一下公式推导。
权重公式: 首先要把模型的误差表示出来,只有用数学公式表示出来,才能够讲模型的优化。
先看第i个样本在t+1个弱学习器的权重是怎样的? 模型误差上限 模型误差上限最小化与Z 求出Z 既然最小化Zt就等同于最小化模型误差上界,那我们得先知道Zt长什么样,然后才能去最小化它。
我们在前面已经说过,为了保证所有样本的权重加起来等于1。因此需要对每个权重除以归一化系数。即Zt实际上就是t+1时刻所有样本原始权重和,也就是时刻的各点权重乘以调整幅度再累加:
求出使得Z最小的参数a AdaBoost计算步骤梳理及优缺点 理论上任何学习器都可以用于Adaboost。但一般来说,使用最广泛的Adaboost弱学习器是决策树和神经网络。对于决策树,Adaboost分类用了CART分类树,而Adaboost回归用了CART回归树。</description>
</item>
<item>
<title>集成学习之Bagging,Boosting</title>
<link>https://reid00.github.io/posts/ml/%E9%9B%86%E6%88%90%E5%AD%A6%E4%B9%A0%E4%B9%8Bbaggingboosting/</link>
<pubDate>Thu, 16 Mar 2023 19:35:27 +0800</pubDate>
<guid>https://reid00.github.io/posts/ml/%E9%9B%86%E6%88%90%E5%AD%A6%E4%B9%A0%E4%B9%8Bbaggingboosting/</guid>
<description>生成子模型的两种取样方式 那么为了造成子模型之间的差距,每个子模型只看样本中的一部分,这就涉及到两种取样方式:
放回取样:Bagging,在统计学中也被称为bootstrap。 不放回取样:Boosting 在集成学习中我们通常采用 Bagging 的方式,具体原因如下:
因为取样后放回,所以不受样本数据量的限制,允许对同一种分类器上对训练集进行进行多次采样,可以训练更多的子模型。 在 train_test_split 时,不那么强烈的依赖随机;而 Boosting的方式,会受到随机的影响; Boosting的随机问题:Pasting 的方式等同于将 500 个样本分成 5 份,每份 100 个样本,怎么分,将对子模型有较大影响,进而对集成系统的准确率有较大影响。 什么是Bagging Bagging,即bootstrap aggregating的缩写,每个训练集称为bootstrap。
Bagging是一种根据均匀概率分布从数据中重复抽样(有放回)的技术 。
Bagging能提升机器学习算法的稳定性和准确性,它可以减少模型的方差从而避免overfitting。它通常应用在决策树方法中,其实它可以应用到任何其它机器学习算法中。
Bagging方法在不稳定模型(unstable models)集合中表现比较好。这里说的不稳定的模型,即在训练数据发生微小变化时产生不同泛化行为的模型(高方差模型),如决策树和神经网络。
但是Bagging在过于简单模型集合中表现并不好,因为Bagging是从总体数据集随机选取样本来训练模型,过于简单的模型可能会产生相同的预测结果,失去了多样性。
总结一下Bagging方法:
Bagging通过降低基分类器的方差,改善了泛化误差 其性能依赖于基分类器的稳定性;如果基分类器不稳定,bagging有助于降低训练数据的随机波动导致的误差;如果稳定,则集成分类器的误差主要由基分类器的偏差引起 由于每个样本被选中的概率相同,因此bagging并不侧重于训练数据集中的任何特定实例 Bagging的使用 sklearn为Bagging提供了一个简单的API:BaggingClassifier类(回归是BaggingRegressor)。首先需要传入一个模型作为参数,可以使用决策树;然后需要传入参数n_estimator即集成多少个子模型;参数max_samples表示每次从数据集中取多少样本;参数bootstrap设置为True表示使用有放回取样Bagging,设置为False表示使用无放回取样Pasting。可以通过n_jobs参数来分配训练所需CPU核的数量,-1表示会使用所有空闲核(集成学习思路,极易并行化处理)。
bagging是不能减小模型的偏差的,因此我们要选择具有低偏差的分类器来集成,例如:没有修剪的决策树。
Bootstrap 在每个预测器被训练的子集中引入了更多的分集,所以 Bagging 结束时的偏差比 Pasting 更高,但这也意味着预测因子最终变得不相关,从而减少了集合的方差。总体而言,Bagging 通常会导致更好的模型,这就解释了为什么它通常是首选的。然而,如果你有空闲时间和 CPU 功率,可以使用交叉验证来评估 Bagging 和 Pasting 哪一个更好。
Out-of-Bag 对于Bagging来说,一些实例可能被一些分类器重复采样,但其他的有可能不会被采样。由于每个bootstrap的M个样本是有放回随机选取的,因此每个样本不被选中的概率为。当N和M都非常大时,比如N=M=10000,一个样本不被选中的概率p = 36.8%。因此一个bootstrap约包含原样本63.2%,约36.8%的样本未被选中。这些没有被采样的训练实例就叫做Out-of-Bag实例。但注意对于每一个的分类器来说,它们各自的未选中部分不是相同的。
那么这些未选中的样本有什么用呢?
因为在训练中分类器从来没有看到过Out-of-Bag实例,所以它可以在这些样本上进行预测,就不用分样本测试集和测试数据集了。
在sklearn中,可以在训练后需要创建一个BaggingClassifier时设置oob_score=True来进行自动评估。
1 2 3 4 5 bagging_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators=5000, max_samples=100, bootstrap=True, oob_score=True) bagging_clf.fit(X, y) bagging_clf.</description>
</item>
<item>
<title>集成学习之GBD</title>
<link>https://reid00.github.io/posts/ml/%E9%9B%86%E6%88%90%E5%AD%A6%E4%B9%A0%E4%B9%8Bgbdt/</link>
<pubDate>Thu, 16 Mar 2023 19:35:27 +0800</pubDate>
<guid>https://reid00.github.io/posts/ml/%E9%9B%86%E6%88%90%E5%AD%A6%E4%B9%A0%E4%B9%8Bgbdt/</guid>
<description>什么是GBDT 到底什么是梯度提升树?所谓的GBDT实际上就是:
GBDT = Gradient Descent + Boosting + Desicion Tree
与Adaboost算法类似,GBDT也是使用了前向分布算法的加法模型。只不过弱学习器限定了只能使用CART回归树模型,同时迭代思路和Adaboost也有所不同。
在Adaboost算法中,我们是利用前一轮迭代弱学习器的误差率来更新训练集的权重。而Gradient Boosting是通过算梯度(gradient)来定位模型的不足。
https://mp.weixin.qq.com/s/rmStKvdHq-BOCJo8ZuvgfQ
最常用的决策树算法: RF, Adaboost, GBDT
https://mp.weixin.qq.com/s/tUl3zhVxLfUd7o06_1Zg2g
Xgboost 的优势和原理 原理: https://www.jianshu.com/p/920592e8bcd2
https://www.jianshu.com/p/ac1c12f3fba1
优势: https://snaildove.github.io/2018/10/02/get-started-XGBoost/
LightGBM 详解 https://blog.csdn.net/VariableX/article/details/106242202
GBDT分类算法流程 GBDT的分类算法从思想上和GBDT的回归算法没有区别,但是由于样本输出不是连续的值,而是离散的类别,导致我们无法直接从输出类别去拟合类别输出的误差。
为了解决这个问题,主要有两个方法:
用指数损失函数,此时GBDT退化为Adaboost算法。 用类似于逻辑回归的对数似然损失函数的方法。也就是说,我们用的是类别的预测概率值和真实概率值的差来拟合损失。 下面我们用对数似然损失函数的GBDT分类。而对于对数似然损失函数,又有二元分类和多元分类的区别。
sklearn中的GBDT调参大法 https://mp.weixin.qq.com/s/756Xsy0uhnb8_rheySqLLg
Boosting重要参数 分类和回归算法的参数大致相同,不同之处会指出。
n_estimators: 弱学习器的个数。个数太小容易欠拟合,个数太大容易过拟合。默认是100,在实际调参的过程中,常常将n_estimators和参数learning_rate一起考虑。
learning_rate: 每个弱学习器的权重缩减系数,也称作步长。如果我们在强学习器的迭代公式加上了正则化项:,则通过learning_rate来控制其权重。对于同样的训练集拟合效果,较小的learning_rate意味着需要更多的弱学习器。通常用二者一起决定算法的拟合效果。所以两个参数n_estimators和learning_rate要一起调参。一般来说,可以从一个小一点的补偿开始调参,默认是1。
subsample: 不放回抽样的子采样,取值为(0,1]。如果取值为1,则全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5, 0.8]之间,默认是1.0,即不使用子采样。
init: 初始化时的弱学习器,即。如果我们对数据有先验知识,或者之前做过一些拟合,可以用init参数提供的学习器做初始化分类回归预测。一般情况下不输入,直接用训练集样本来做样本集的初始化分类回归预测。
loss: GBDT算法中的损失函数。分类模型和回归模型的损失函数是不一样。
对于回归模型,可以使用均方误差ls,绝对损失lad,Huber损失huber和分位数损失quantile,默认使用均方误差ls。如果数据的噪音点不多,用默认的均方差ls比较好;如果噪音点较多,则推荐用抗噪音的损失函数huber;而如果需要对训练集进行分段预测,则采用quantile。 对于分类模型,可以使用对数似然损失函数deviance和指数损失函数exponential。默认是对数似然损失函数deviance。在原理篇中对这些分类损失函数有详细的介绍。一般来说,推荐使用默认的&quot;deviance&quot;。它对二元分离和多元分类各自都有比较好的优化。而指数损失函数等于把我们带到了Adaboost算法。 alpha: 这个参数只有回归算法有,当使用Huber损失huber和分位数损失quantile时,需要指定分位数的值。默认是0.9,如果噪音点较多,可以适当降低这个分位数的值。
弱学习器参数 GBDT使用了CART回归决策树,因此它的参数基本和决策树类似。
max_features: 划分时考虑的最大特征数,默认是&quot;None&quot;。默认时表示划分时考虑所有的特征数;如果是&quot;log2&quot;意味着划分时最多考虑个log2N特征;如果是&quot;sqrt&quot;或者&quot;auto&quot;意味着划分时最多考虑根号N个特征。如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比,即考虑(百分比*N)取整后的特征数。其中N为样本总特征数。一般来说,如果样本特征数不多,比如小于50,我们用默认的&quot;None&quot;就可以了,如果特征数非常多,可以灵活控制划分时考虑的最大特征数,以控制决策树的生成时间。 max_depth: 决策树最大深度。如果不输入,默认值是3。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。 min_samples_split: 内部节点再划分所需最小样本数。限制子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。默认是2,如果样本量数量级非常大,则增大这个值。 min_samples_leaf: 叶子节点最少样本数。限制叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。 min_weight_fraction_leaf: 叶子节点最小的样本权重和这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。 max_leaf_nodes: 最大叶子节点数。通过限制最大叶子节点数,可以防止过拟合,默认是None,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。 min_impurity_split: 节点划分最小不纯度。这个值限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。一般不推荐改动默认值1e-7。 GBDT有很多优点:</description>
</item>
<item>
<title>逻辑回归的常见面试题总结</title>
<link>https://reid00.github.io/posts/ml/%E9%80%BB%E8%BE%91%E5%9B%9E%E5%BD%92%E7%9A%84%E5%B8%B8%E8%A7%81%E9%9D%A2%E8%AF%95%E9%A2%98%E6%80%BB%E7%BB%93/</link>
<pubDate>Thu, 16 Mar 2023 19:35:26 +0800</pubDate>
<guid>https://reid00.github.io/posts/ml/%E9%80%BB%E8%BE%91%E5%9B%9E%E5%BD%92%E7%9A%84%E5%B8%B8%E8%A7%81%E9%9D%A2%E8%AF%95%E9%A2%98%E6%80%BB%E7%BB%93/</guid>
<description>1.简介 逻辑回归是面试当中非常喜欢问到的一个机器学习算法,因为表面上看逻辑回归形式上很简单,很好掌握,但是一问起来就容易懵逼。所以在面试的时候给大家的第一个建议不要说自己精通逻辑回归,非常容易被问倒,从而减分。下面总结了一些平常我在作为面试官面试别人和被别人面试的时候,经常遇到的一些问题。
Regression问题的常规步骤为:
寻找h函数(即假设估计的函数); 构造J函数(损失函数); 想办法使得J函数最小并求得回归参数(θ); 数据拟合问题 2.正式介绍 如何凸显你是一个对逻辑回归已经非常了解的人呢。那就是用一句话概括它!逻辑回归假设数据服从伯努利分布,通过极大化似然函数的方法,运用梯度下降来求解参数,来达到将数据二分类的目的。
这里面其实包含了5个点 1:逻辑回归的假设,2:逻辑回归的损失函数,3:逻辑回归的求解方法,4:逻辑回归的目的,5:逻辑回归如何分类。这些问题是考核你对逻辑回归的基本了解。
逻辑回归的基本假设 任何的模型都是有自己的假设,在这个假设下模型才是适用的。逻辑回归的第一个基本假设是**假设数据服从伯努利分布。**伯努利分布有一个简单的例子是抛硬币,抛中为正面的概率是pp,抛中为负面的概率是1−p1−p.在逻辑回归这个模型里面是假设 hθ(x)hθ(x) 为样本为正的概率,1−hθ(x)1−hθ(x)为样本为负的概率。那么整个模型可以描述为
hθ(x;θ)=phθ(x;θ)=p
逻辑回归的第二个假设是假设样本为正的概率是
p=11+e−θTxp=11+e−θTx
所以逻辑回归的最终形式
hθ(x;θ)=11+e−θTx
逻辑回归的求解方法 由于该极大似然函数无法直接求解,我们一般通过对该函数进行梯度下降来不断逼急最优解。在这个地方其实会有个加分的项,考察你对其他优化方法的了解。因为就梯度下降本身来看的话就有随机梯度下降,批梯度下降,small batch 梯度下降三种方式,面试官可能会问这三种方式的优劣以及如何选择最合适的梯度下降方式。
简单来说 批梯度下降会获得全局最优解,缺点是在更新每个参数的时候需要遍历所有的数据,计算量会很大,并且会有很多的冗余计算,导致的结果是当数据量大的时候,每个参数的更新都会很慢。
随机梯度下降是以高方差频繁更新,优点是使得sgd(随机梯度下降)会跳到新的和潜在更好的局部最优解,缺点是使得收敛到局部最优解的过程更加的复杂。
如果使用梯度下降法(批量梯度下降法),那么每次迭代过程中都要对 个样本进行求梯度,所以开销非常大,随机梯度下降的思想就是随机采样一个样本 来更新参数,那么计算开销就从 下降到 。
随机梯度下降虽然提高了计算效率,降低了计算开销,但是由于每次迭代只随机选择一个样本,因此随机性比较大,所以下降过程中非常曲折
可以看到多了随机两个字,随机也就是说我们用样本中的一个例子来近似我所有的样本,来调整θ,因而随机梯度下降是会带来一定的问题,因为计算得到的并不是准确的一个梯度,**对于最优化问题,凸问题,**虽然不是每次迭代得到的损失函数都向着全局最优方向, 但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近。
小批量梯度下降结合了sgd和batch gd的优点,每次更新的时候使用n个样本。减少了参数更新的次数,可以达到更加稳定收敛结果,一般在深度学习当中我们采用这种方法。小批量梯度下降的开销为 其中 是批量大小。
其实这里还有一个隐藏的更加深的加分项,看你了不了解诸如Adam,动量法等优化方法。因为上述方法其实还有两个致命的问题。 第一个是如何对模型选择合适的学习率。自始至终保持同样的学习率其实不太合适。因为一开始参数刚刚开始学习的时候,此时的参数和最优解隔的比较远,需要保持一个较大的学习率尽快逼近最优解。但是学习到后面的时候,参数和最优解已经隔的比较近了,你还保持最初的学习率,容易越过最优点,在最优点附近来回振荡,通俗一点说,就很容易学过头了,跑偏了。 第二个是如何对参数选择合适的学习率。在实践中,对每个参数都保持的同样的学习率也是很不合理的。有些参数更新频繁,那么学习率可以适当小一点。有些参数更新缓慢,那么学习率就应该大一点。这里我们不展开,有空我会专门出一个专题介绍。 逻辑回归的目的 该函数的目的便是将数据二分类,提高准确率。 逻辑回归如何分类 逻辑回归作为一个回归(也就是y值是连续的),如何应用到分类上去呢。y值确实是一个连续的变量。逻辑回归的做法是划定一个阈值,y值大于这个阈值的是一类,y值小于这个阈值的是另外一类。阈值具体如何调整根据实际情况选择。一般会选择0.5做为阈值来划分。 逻辑回归的损失函数为什么要使用极大似然函数作为损失函数? 损失函数一般有四种,平方损失函数,对数损失函数,HingeLoss0-1损失函数,绝对值损失函数。将极大似然函数取对数以后等同于对数损失函数。在逻辑回归这个模型下,对数损失函数的训练求解参数的速度是比较快的。至于原因大家可以求出这个式子的梯度更新
这个式子的更新速度只和相关。和sigmod函数本身的梯度是无关的。这样更新的速度是可以自始至终都比较的稳定。
为什么不选平方损失函数的呢?其一是因为如果你使用平方损失函数,你会发现梯度更新的速度和sigmod函数本身的梯度是很相关的。sigmod函数在它在定义域内的梯度都不大于0.25。这样训练会非常的慢。
逻辑回归在训练的过程当中,如果有很多的特征高度相关或者说有一个特征重复了100遍,会造成怎样的影响? 先说结论,如果在损失函数最终收敛的情况下,其实就算有很多特征高度相关也不会影响分类器的效果。
但是对特征本身来说的话,假设只有一个特征,在不考虑采样的情况下,你现在将它重复100遍。训练以后完以后,数据还是这么多,但是这个特征本身重复了100遍,实质上将原来的特征分成了100份,每一个特征都是原来特征权重值的百分之一
如果在随机采样的情况下,其实训练收敛完以后,还是可以认为这100个特征和原来那一个特征扮演的效果一样,只是可能中间很多特征的值正负相消了。
为什么我们还是会在训练的过程当中将高度相关的特征去掉? 去掉高度相关的特征会让模型的可解释性更好 可以大大提高训练的速度。如果模型当中有很多特征高度相关的话,就算损失函数本身收敛了,但实际上参数是没有收敛的,这样会拉低训练的速度。其次是特征多了,本身就会增大训练的时间。 4.逻辑回归的优缺点总结 优点
形式简单,模型的可解释性非常好。从特征的权重可以看到不同的特征对最后结果的影响,某个特征的权重值比较高,那么这个特征最后对结果的影响会比较大。
模型效果不错。在工程上是可以接受的(作为baseline),如果特征工程做的好,效果不会太差,并且特征工程可以大家并行开发,大大加快开发的速度。
训练速度较快。分类的时候,计算量仅仅只和特征的数目相关。并且逻辑回归的分布式优化sgd发展比较成熟,训练的速度可以通过堆机器进一步提高,这样我们可以在短时间内迭代好几个版本的模型。
资源占用小,尤其是内存。因为只需要存储各个维度的特征值,。
方便输出结果调整。逻辑回归可以很方便的得到最后的分类结果,因为输出的是每个样本的概率分数,我们可以很容易的对这些概率分数进行cutoff,也就是划分阈值(大于某个阈值的是一类,小于某个阈值的是一类)。
但是逻辑回归本身也有许多的缺点:
准确率并不是很高。因为形式非常的简单(非常类似线性模型),很难去拟合数据的真实分布。
很难处理数据不平衡的问题。举个例子:如果我们对于一个正负样本非常不平衡的问题比如正负样本比 10000:1.我们把所有样本都预测为正也能使损失函数的值比较小。但是作为一个分类器,它对正负样本的区分能力不会很好。
处理非线性数据较麻烦。逻辑回归在不引入其他方法的情况下,只能处理线性可分的数据,或者进一步说,处理二分类的问题 。</description>
</item>
<item>
<title>随机森林(回归树)模型</title>
<link>https://reid00.github.io/posts/ml/%E9%9A%8F%E6%9C%BA%E6%A3%AE%E6%9E%97%E5%9B%9E%E5%BD%92%E6%A0%91%E6%A8%A1%E5%9E%8B/</link>
<pubDate>Thu, 16 Mar 2023 19:35:26 +0800</pubDate>
<guid>https://reid00.github.io/posts/ml/%E9%9A%8F%E6%9C%BA%E6%A3%AE%E6%9E%97%E5%9B%9E%E5%BD%92%E6%A0%91%E6%A8%A1%E5%9E%8B/</guid>
<description>调参 ★ 在 scikit-learn 中,Random Forest(以下简称RF)的分类类是 RandomForestClassifier,回归类是 RandomForestRegressor。
RF 需要调参的参数也包括两部分,第一部分是 Bagging 框架的参数,第二部分是 CART 决策树的参数。下面我们就对这些参数做一个介绍。
RF 框架参数 首先我们关注于 RF 的 Bagging 框架的参数。这里可以和 GBDT 对比来学习。GBDT 的框架参数比较多,重要的有最大迭代器个数,步长和子采样比例,调参起来比较费力。但是 RF 则比较简单,这是因为 bagging 框架里的各个弱学习器之间是没有依赖关系的,这减小的调参的难度。换句话说,达到同样的调参效果,RF 调参时间要比 GBDT 少一些。
下面我来看看 RF 重要的 Bagging 框架的参数,由于 RandomForestClassifier 和 RandomForestRegressor 参数绝大部分相同,这里会将它们一起讲,不同点会指出。
n_estimators:也就是弱学习器的最大迭代次数,或者说最大的弱学习器的个数。一般来说 n_estimators 太小,容易欠拟合,n_estimators 太大,计算量会太大,并且 n_estimators 到一定的数量后,再增大 n_estimators 获得的模型提升会很小,所以一般选择一个适中的数值。默认是 100 。
oob_score:即是否采用袋外样本来评估模型的好坏。默认识 False 。个人推荐设置为 True ,因为袋外分数反应了一个模型拟合后的泛化能力。
criterion: 即 CART 树做划分时对特征的评价标准。分类模型和回归模型的损失函数是不一样的。分类 RF 对应的 CART 分类树默认是基尼系数 gini ,另一个可选择的标准是信息增益。回归 RF 对应的 CART 回归树默认是均方差 mse ,另一个可以选择的标准是绝对值差 mae 。一般来说选择默认的标准就已经很好的。</description>
</item>
<item>
<title>随机森林算法及其在特征选择中的应用</title>
<link>https://reid00.github.io/posts/ml/%E9%9A%8F%E6%9C%BA%E6%A3%AE%E6%9E%97%E7%AE%97%E6%B3%95%E5%8F%8A%E5%85%B6%E5%9C%A8%E7%89%B9%E5%BE%81%E9%80%89%E6%8B%A9%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8/</link>
<pubDate>Thu, 16 Mar 2023 19:35:26 +0800</pubDate>
<guid>https://reid00.github.io/posts/ml/%E9%9A%8F%E6%9C%BA%E6%A3%AE%E6%9E%97%E7%AE%97%E6%B3%95%E5%8F%8A%E5%85%B6%E5%9C%A8%E7%89%B9%E5%BE%81%E9%80%89%E6%8B%A9%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8/</guid>
<description>随机森林算法思想 随机森林(Random Forest)使用多个CART决策树作为弱学习器,不同决策树之间没有关联。当我们进行分类任务时,新的输入样本进入,就让森林中的每一棵决策树分别进行判断和分类,每个决策树会得到一个自己的分类结果,决策树的分类结果中哪一个分类最多,那么随机森林就会把这个结果当做最终的结果。
随机森林在生成决策树的时候用随机选择的特征,即使用Bagging方法。这么做的原因是:如果训练集中的某几个特征对输出的结果有很强的预测性,那么这些特征会被每个决策树所应用,这样会导致树之间具有相关性,这样并不会减小模型的方差。
随机森林对决策树的建立做了一些改进:
随机森林不会像普通决策树一样选择最优特征进行子树的划分,而是随机选择节点上的一部分样本特征:Nsub(子集),然后在随机挑选出来的集合Nsub中,选择一个最优的特征来做决策树的左右子树划分。一般情况下,推荐子集Nsub内特征的个数为log2d个。这样进一步增强了模型的泛化能力。
如果Nsub=N,则此时随机森林的CART决策树和普通的CART决策树没有区别。Nsub越小,则模型越健壮。当然此时对于训练集的拟合程度会变差。也就是说Nsub越小,模型的方差会减小,但是偏差会增大。在实际案例中,一般会通过交叉验证调参获取一个合适的的Nsub值。
随机森林有一个缺点:不像决策树一样有很好地解释性。但是,随机森林有更好地准确性,同时也并不需要修剪随机森林。对于随机森林来说,只需要选择一个参数,生成决策树的个数。通常情况下,决策树的个数越多,性能越好,但是,计算开销同时也增大了。
随机森林建立过程 第一步:原始训练集D中有N个样本,且每个样本有W维特征。从数据集D中有放回的随机抽取x个样本(Bootstraping方法)组成训练子集Dsub,一共进行w次采样,即生成w个训练子集Dsub。
第二步:每个训练子集Dsub形成一棵决策树,形成了一共w棵决策树。而每一次未被抽到的样本则组成了w个oob(用来做预估)。
第三步:对于单个决策树,树的每个节点处从M个特征中随机挑选m(m&lt;M)个特征,按照结点不纯度最小原则进行分裂。每棵树都一直这样分裂下去,直到该节点的所有训练样例都属于同一类。在决策树的分裂过程中不需要剪枝。
第四步:根据生成的多个决策树分类器对需要进行预测的数据进行预测。根据每棵决策树的投票结果,如果是分类树的话,最后取票数最高的一个类别;如果是回归树的话,利用简单的平均得到最终结果。
随机森林算法优缺点总结及面试问题 随机森林是Bagging的一个扩展变体,是在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择。
随机森林简单、容易实现、计算开销小,在很多实际应用中都变现出了强大的性能,被誉为“代表集成学习技术水平的方法”。可以看出,随机森林对Bagging只做了小改动。并且,Bagging满足差异性的方法是对训练集进行采样;而随机森林不但对训练集进行随机采样,而且还随机选择特征子集,这就使最终集成的泛化性进一步提升。
随着基学习器数目的增加,随机森林通常会收敛到更低的泛化误差,并且训练效率是优于Bagging的。
总结一下随机森林的优缺点:
优点:
训练可以高度并行化,对于大数据时代的大样本训练速度有优势。个人觉得这是的最主要的优点。 由于可以随机选择决策树节点划分特征,这样在样本特征维度很高的时候,仍然能高效的训练模型。 在训练后,可以给出各个特征对于输出的重要性。 由于采用了随机采样,训练出的模型的方差小,泛化能力强。 相对于Boosting系列的Adaboost和GBDT, RF实现比较简单。 对部分特征缺失不敏感。 缺点有:
在某些噪音比较大的样本集上,RF模型容易陷入过拟合。 取值划分比较多的特征容易对RF的决策产生更大的影响,从而影响拟合的模型的效果。 下面看几个面试问题:
1、为什么要有放回的抽样?保证样本集间有重叠,若不放回,每个训练样本集及其分布都不一样,可能导致训练的各决策树差异性很大,最终多数表决无法 “求同”,即最终多数表决相当于“求同”过程。
2、为什么RF的训练效率优于bagging?因为在个体决策树的构建过程中,Bagging使用的是“确定型”决策树,bagging在选择划分属性时要对每棵树是对所有特征进行考察;而随机森林仅仅考虑一个特征子集。
3、随机森林需要剪枝吗?不需要,后剪枝是为了避免过拟合,随机森林随机选择变量与树的数量,已经避免了过拟合,没必要去剪枝了。一般rf要控制的是树的规模,而不是树的置信度,剩下的每棵树需要做的就是尽可能的在自己所对应的数据(特征)集情况下尽可能的做到最好的预测结果。剪枝的作用其实被集成方法消解了,所以用处不大。
Extra-Tree及其与RF的区别 Extra-Tree是随机森林的一个变种, 原理几乎和随机森林一模一样,可以称为:“极其随机森林”,即决策树在节点的划分上,使用随机的特征和随机的阈值。
特征和阈值提供了额外随机性,抑制了过拟合,再一次用高偏差换低方差。它还使得 Extra-Tree 比规则的随机森林更快地训练,因为在每个节点上找到每个特征的最佳阈值是生长树最耗时的任务之一。
Extra-Tree与随机森林的区别有以下两点:
对于每个决策树的训练集,随机森林采用的是随机采样bootstrap来选择采样集作为每个决策树的训练集,而Extra-Tree一般不采用随机采样,即每个决策树采用原始训练集。 在选定了划分特征后,随机森林的决策树会基于基尼系数,均方差之类的原则,选择一个最优的特征值划分点,这和传统的决策树相同。但是Extra-Tree比较的激进,他会随机的选择一个特征值来划分决策树。 从第二点可以看出,由于随机选择了特征值的划分点位,而不是最优点位,这样会导致生成的决策树的规模一般会大于随机森林所生成的决策树。也就是说,模型的方差相对于随机森林进一步减少,但是偏倚相对于随机森林进一步增大。在某些时候,Extra-Tree的泛化能力比随机森林更好。
RF评估特征重要性 在实际业务场景中,我们会关系如何在高维数据中选择对结果影响最大的前n个特征。我们可以使用PCA、LASSO等方法,当然也可以用RF算法来进行特征选择。感兴趣的话。
RF算法的有一个典型的应用:评估单个特征变量的重要性并进行特征选择。
举一个具体的应用场景:银行贷款业务中能否正确的评估企业的信用度,关系到能否有效地回收贷款。但是信用评估模型的数据特征有很多,其中不乏有很多噪音,所以需要计算出每一个特征的重要性并对这些特征进行一个排序,进而可以从所有特征中选择出重要性靠前的特征。
下面我们来看看评估特征重要性的步骤:
对于RF中的每一棵决策树,选择OOB数据计算模型的预测错误率,记为Error1。(在随机森林算法中不需要再进行交叉验证来获取测试集误差的无偏估计)
然后在OOB中所有样本的特征A上加入随机噪声,接着再次用OOB数据计算模型预测错误率,记为Error2。
若森林中有N棵树,则特征A的重要性为 求和(Error2-Error1/N)。
我们细品:在某一特征A上增加了噪音,那么就有理由相信错误率Error2要大于Error1,Error2越大说明特征A重要。
可以这么理解,小A从公司离职了,这个公司倒闭了,说明小A很重要;如果小A走了,公司没变化,说明小A也没啥用。
在sklearn中我们可以这么做:
1 2 3 4 5 6 7 8 from sklearn.cross_validation import train_test_split from sklearn.ensemble import RandomForestClassifier (处理数据) rf_clf = RandomForestClassifier(n_estimators=1000, random_state=666) rf_clf.</description>
</item>
<item>
<title>生成模型vs判别模型</title>
<link>https://reid00.github.io/posts/ml/%E7%94%9F%E6%88%90%E6%A8%A1%E5%9E%8Bvs%E5%88%A4%E5%88%AB%E6%A8%A1%E5%9E%8B/</link>
<pubDate>Thu, 16 Mar 2023 19:35:25 +0800</pubDate>
<guid>https://reid00.github.io/posts/ml/%E7%94%9F%E6%88%90%E6%A8%A1%E5%9E%8Bvs%E5%88%A4%E5%88%AB%E6%A8%A1%E5%9E%8B/</guid>
<description>什么是生成模型和判别模型? 从本质上讲,生成模型和判别模型是解决分类问题的两类基本思路。首先,您得先了解,分类问题,就是给定一个数据x,要判断它对应的标签y(这么naive的东西都要解释下,求面试官此时内心的阴影面积,嘎嘎)。生成模型就是要学习x和y的联合概率分布P(x,y),然后根据贝叶斯公式来求得条件概率P(y|x),预测条件概率最大的y。贝叶斯公式这么简单的知识相信您也了解,我就不啰嗦了。判别模型就是直接学习条件概率分布P(y|x)。
举个栗子 例子1 假设你从来没有见过大象和猫,连听都没有听过,这时,给你看了一张大象的照片和一张猫的照片。如下所示:
然后牵来我家的大象(面试官:你家开动物园的吗?),让你判断这是大象还是猫。你咋办?
你开始回想刚刚看过的照片,大概记起来,大象和猫比起来,有个长鼻子,而眼前这个家伙也有个长鼻子,所以,你兴奋地说:“这是大象!”恭喜你答对了!
你也有可能这样做,你努力回想刚才的两张照片,然后用笔把它们画在了纸上,拿着纸和我家的大象做比较,你发现,眼前的动物更像是大象。于是,你惊喜地宣布:“这玩意是大象!”恭喜你又答对了!
在这个问题中,第一个解决问题的思路就是判别模型,因为你只记住了大象和猫之间的不同之处。第二个解决问题的思路就是生成模型,因为你实际上学习了什么是大象,什么是猫。
例子2 来来来,看一下这四个形式为(x,y)的样本。(1,0), (1,0), (2,0), (2, 1)。假设,我们想从这四个样本中,学习到如何通过x判断y的模型。用生成模型,我们要学习P(x,y)。如下所示:
我们学习到了四个概率值,它们的和是1,这就是P(x,y)。
我们也可以用判别模型,我们要学习P(y|x),如下所示:
我们同样学习到了四个概率值,但是,这次,是每一行的两个概率值的和为1了。让我们具体来看一下,如何使用这两个模型做判断。
假设 x=1。
对于生成模型, 我们会比较:
P(x=1,y=0) = 1/2 P(x=1,y=1) = 0 我们发现P(x=1,y=0)的概率要比P(x=1,y=1)的概率大,所以,我们判断:x=1时,y=0。
对于判别模型,我们会比较:
P(y=0|x=1) = 1 P(y=1|x=1) = 0 同样,P(y=0|x=1)要比P(y=1|x=1)大,所以,我们判断:x=1时,y=0。
我们看到,虽然最后预测的结果一样,但是得出结果的逻辑却是完全不同的。两个栗子说完,你心里感到很痛快,面试官脸上也露出了赞赏的微笑,但是,他突然问了一个问题。
生成模型为啥叫生成模型 这个问题着实让你没想到,不过,聪明的你略加思考,应该就可以想到。生成模型之所以叫生成模型,是因为,它背后的思想是,x是特征,y是标签,什么样的标签就会生成什么样的特征。好比说,标签是大象,那么可能生成的特征就有大耳朵,长鼻子等等。
当我们来根据x来判断y时,我们实际上是在比较,什么样的y标签更可能生成特征x,我们预测的结果就是更可能生成x特征的y标签。
常见的生成模型和判别模型有哪些呢 生成模型
HMM
朴素贝叶斯
判别模型
逻辑回归
SVM
CRF
最近邻
一般的神经网络</description>
</item>
<item>
<title>线性回归</title>
<link>https://reid00.github.io/posts/ml/%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92/</link>
<pubDate>Thu, 16 Mar 2023 19:35:25 +0800</pubDate>
<guid>https://reid00.github.io/posts/ml/%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92/</guid>
<description>介绍 称函数为效用函数 线性回归模型看起来非常简单,简单到让人怀疑其是否有研究价值以及使用价值。但实际上,线性回归模型可以说是最重要的数学模型之一,很多模型都是建立在它的基础之上,可以被称为是“模型之母”。
1.1 什么是简单线性回归 所谓简单,是指只有一个样本特征,即只有一个自变量;所谓线性,是指方程是线性的;所谓回归,是指用方程来模拟变量之间是如何关联的。
简单线性回归,其思想简单,实现容易(与其背后强大的数学性质相关。同时也是许多强大的非线性模型(多项式回归、逻辑回归、SVM)的基础。并且其结果具有很好的可解释性。
1.2 一种基本推导思 我们所谓的建模过程,其实就是找到一个模型,最大程度的拟合我们的数据。 在简单线回归问题中,模型就是我们的直线方程:y = ax + b 。
要想最大的拟合数据,本质上就是找到没有拟合的部分,也就是损失的部分尽量小,就是损失函数(loss function)(也有算法是衡量拟合的程度,称函数为效用函数(utility function)):
因此,推导思路为:
通过分析问题,确定问题的损失函数或者效用函数; 然后通过最优化损失函数或者效用函数,获得机器学习的模型 近乎所有参数学习算法都是这样的套路,区别是模型不同,建立的目标函数不同,优化的方式也不同。
回到简单线性回归问题,目标:
已知训练数据样本、 ,找到和的值,使 尽可能小
这是一个典型的最小二乘法问题(最小化误差的平方)
通过最小二乘法可以求出a、b的表达式:
最小二乘法 2.1 由损失函数引出一堆“风险” 2.1.1 损失函数 在机器学习中,所有的算法模型其实都依赖于最小化或最大化某一个函数,我们称之为“目标函数”。
最小化的这组函数被称为“损失函数”。什么是损失函数呢?
损失函数描述了单个样本预测值和真实值之间误差的程度。用来度量模型一次预测的好坏。
损失函数是衡量预测模型预测期望结果表现的指标。损失函数越小,模型的鲁棒性越好。。
常用损失函数有:
0-1损失函数:用来表述分类问题,当预测分类错误时,损失函数值为1,正确为
平方损失函数:用来描述回归问题,用来表示连续性变量,为预测值与真实值差值的平方。(误差值越大、惩罚力度越强,也就是对差值敏感)
绝对损失函数:用在回归模型,用距离的绝对值来衡量 对数损失函数:是预测值Y和条件概率之间的衡量。事实上,该损失函数用到了极大似然估计的思想。P(Y|X)通俗的解释就是:在当前模型的基础上,对于样本X,其预测值为Y,也就是预测正确的概率。由于概率之间的同时满足需要使用乘法,为了将其转化为加法,我们将其取对数。最后由于是损失函数,所以预测正确的概率越高,其损失值应该是越小,因此再加个负号取个反。 以上损失函数是针对于单个样本的,但是一个训练数据集中存在N个样本,N个样本给出N个损失,如何进行选择呢?
这就引出了风险函数。
2.1.2 期望风险 期望风险是损失函数的期望,用来表达理论上模型f(X)关于联合分布P(X,Y)的平均意义下的损失。又叫期望损失/风险函数。
2.1.3 经验风险 模型f(X)关于训练数据集的平均损失,称为经验风险或经验损失。
其公式含义为:模型关于训练集的平均损失(每个样本的损失加起来,然后平均一下)
经验风险最小的模型为最优模型。在训练集上最小经验风险最小,也就意味着预测值和真实值尽可能接近,模型的效果越好。公式含义为取训练样本集中对数损失函数平均值的最小。
2.1.4 经验风险最小化和结构风险最小化 期望风险是模型关于联合分布的期望损失,经验风险是模型关于训练样本数据集的平均损失。根据大数定律,当样本容量N趋于无穷时,经验风险趋于期望风险。
因此很自然地想到用经验风险去估计期望风险。但是由于训练样本个数有限,可能会出现过度拟合的问题,即决策函数对于训练集几乎全部拟合,但是对于测试集拟合效果过差。因此需要对其进行矫正:
结构风险最小化:当样本容量不大的时候,经验风险最小化容易产生“过拟合”的问题,为了“减缓”过拟合问题,提出了结构风险最小理论。结构风险最小化为经验风险与复杂度同时较小。 通过公式可以看出,结构风险:在经验风险上加上一个正则化项(regularizer),或者叫做罚项(penalty) 。正则化项是J(f)是函数的复杂度再乘一个权重系数(用以权衡经验风险和复杂度)
2.1.5 小结 1、损失函数:单个样本预测值和真实值之间误差的程度。
2、期望风险:是损失函数的期望,理论上模型f(X)关于联合分布P(X,Y)的平均意义下的损失。
3、经验风险:模型关于训练集的平均损失(每个样本的损失加起来,然后平均一下)。
4、结构风险:在经验风险上加上一个正则化项,防止过拟合的策略。
2.2 最小二乘法 2.2.1 什么是最小二乘法 言归正传,进入最小二乘法的部分。</description>
</item>
<item>
<title>逻辑回归</title>
<link>https://reid00.github.io/posts/ml/%E9%80%BB%E8%BE%91%E5%9B%9E%E5%BD%92/</link>
<pubDate>Thu, 16 Mar 2023 19:35:25 +0800</pubDate>
<guid>https://reid00.github.io/posts/ml/%E9%80%BB%E8%BE%91%E5%9B%9E%E5%BD%92/</guid>
<description>一、线性模型预测一个样本的损失量 损失量:模型对样本的预测结果和该样本对应的实际结果的差距;
1)为什么会想到用 y = -log(x) 函数? (该函数称为 惩罚函数:预测结果与实际值的偏差越大,惩罚越大) y = 1(p ≥ 0.5)时,cost = -log(p),p 越小,样本发生概率越小(最小为 0),则损失函数越大,分类预测值和实际值的偏差越大;相反,p 越大,样本发生概率越大(最大为 0.5),则损失函数越小,则预测值和实际值的偏差越小; y = 0(p ≤ 0.5)时,cost = -log(1-p),p 越小,样本发生概率越小(最小为 0.5),则损失函数越大,分类预测值和实际值的偏差越大;相反,p 越大,样本发生概率越大(最大为 1),则损失函数越小,则预测值和实际值的偏差越小; 2)求一个样本的损失量 由于逻辑回归解决的是分类问题,而且是二分类,因此定义损失函数时也要有两类
惩罚函数变形:
惩罚函数作用:计算预测结果针对实际值的损失量;
已知样本发生的概率 p(也可以相应求出预测值),以及该样本的实际分类结果,得出此次预测结果针对真值的损失量是多少; 二、求数据集的损失函数 模型变形,得到数据集的损失函数:数据集中的所有样本的损失值的和; 最终的损失函数模型 该模型不能优化成简单的数学表达式(或者说是正规方程解:线性回归算法找那个的fit_normal() 方法),只能使用梯度下降法求解; 该函数为凸函数,没有局部最优解,只存在全局最优解; 三、逻辑回归损失函数的梯度 损失函数: 1)σ(t) 函数的导数 2)log(σ(t)) 函数的导数 变形:
3)log(1 - σ(t)) 函数的导数 4)对损失函数 J(θ) 的其中某一项(第 i 行,第 j 列)求导 两式相加: 5)损失函数 J(θ) 的梯度 与线性回归梯度对比
注:两者的预测值 ý 不同; 梯度向量化处理 四、代码实现逻辑回归算法 逻辑回归算法是在线性回归算法的基础上演变的;</description>
</item>
<item>
<title>梯度下降原理介绍</title>
<link>https://reid00.github.io/posts/ml/%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D%E5%8E%9F%E7%90%86%E4%BB%8B%E7%BB%8D/</link>
<pubDate>Thu, 16 Mar 2023 19:35:24 +0800</pubDate>
<guid>https://reid00.github.io/posts/ml/%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D%E5%8E%9F%E7%90%86%E4%BB%8B%E7%BB%8D/</guid>
<description>Summary 本文将从一个下山的场景开始,先提出梯度下降算法的基本思想,进而从数学上解释梯度下降算法的原理,最后实现一个简单的梯度下降算法的实例!
梯度下降的场景假设 梯度下降法的基本思想可以类比为一个下山的过程。假设这样一个场景:一个人被困在山上,需要从山上下来(i.e. 找到山的最低点,也就是山谷)。但此时山上的浓雾很大,导致可视度很低。因此,下山的路径就无法确定,他必须利用自己周围的信息去找到下山的路径。这个时候,他就可以利用梯度下降算法来帮助自己下山。具体来说就是,以他当前的所处的位置为基准,寻找这个位置最陡峭的地方,然后朝着山的高度下降的地方走,同理,如果我们的目标是上山,也就是爬到山顶,那么此时应该是朝着最陡峭的方向往上走。然后每走一段距离,都反复采用同一个方法,最后就能成功的抵达山谷。
我们同时可以假设这座山最陡峭的地方是无法通过肉眼立马观察出来的,而是需要一个复杂的工具来测量,同时,这个人此时正好拥有测量出最陡峭方向的能力。所以,此人每走一段距离,都需要一段时间来测量所在位置最陡峭的方向,这是比较耗时的。那么为了在太阳下山之前到达山底,就要尽可能的减少测量方向的次数。这是一个两难的选择,如果测量的频繁,可以保证下山的方向是绝对正确的,但又非常耗时,如果测量的过少,又有偏离轨道的风险。所以需要找到一个合适的测量方向的频率,来确保下山的方向不错误,同时又不至于耗时太多!
梯度下降 首先,我们有一个可微分的函数。这个函数就代表着一座山。我们的目标就是找到这个函数的最小值,也就是山底。根据之前的场景假设,最快的下山的方式就是找到当前位置最陡峭的方向,然后沿着此方向向下走,对应到函数中,就是找到给定点的梯度 ,然后朝着梯度相反的方向,就能让函数值下降的最快!因为梯度的方向就是函数之变化最快的方向(在后面会详细解释) 所以,我们重复利用这个方法,反复求取梯度,最后就能到达局部的最小值,这就类似于我们下山的过程。而求取梯度就确定了最陡峭的方向,也就是场景中测量方向的手段。那么为什么梯度的方向就是最陡峭的方向呢?接下来,我们从微分开始讲起
微分 看待微分的意义,可以有不同的角度,最常用的两种是:
函数图像中,某点的切线的斜率
函数的变化率 几个微分的例子:
上面的例子都是单变量的微分,当一个函数有多个变量的时候,就有了多变量的微分,即分别对每个变量进行求微分
梯度 梯度实际上就是多变量微分的一般化。 下面这个例子:
我们可以看到,梯度就是分别对每个变量进行微分,然后用逗号分割开,梯度是用&lt;&gt;包括起来,说明梯度其实一个向量。
梯度是微积分中一个很重要的概念,之前提到过梯度的意义
在单变量的函数中,梯度其实就是函数的微分,代表着函数在某个给定点的切线的斜率 在多变量函数中,梯度是一个向量,向量有方向,梯度的方向就指出了函数在给定点的上升最快的方向 这也就说明了为什么我们需要千方百计的求取梯度!我们需要到达山底,就需要在每一步观测到此时最陡峭的地方,梯度就恰巧告诉了我们这个方向。梯度的方向是函数在给定点上升最快的方向,那么梯度的反方向就是函数在给定点下降最快的方向,这正是我们所需要的。所以我们只要沿着梯度的方向一直走,就能走到局部的最低点!
梯度下降算法的数学解释 上面我们花了大量的篇幅介绍梯度下降算法的基本思想和场景假设,以及梯度的概念和思想。下面我们就开始从数学上解释梯度下降算法的计算过程和思想! 此公式的意义是:J是关于Θ的一个函数,我们当前所处的位置为Θ0点,要从这个点走到J的最小值点,也就是山底。首先我们先确定前进的方向,也就是梯度的反向,然后走一段距离的步长,也就是α,走完这个段步长,就到达了Θ1这个点!
下面就这个公式的几个常见的疑问:
α是什么含义? α在梯度下降算法中被称作为学习率或者步长,意味着我们可以通过α来控制每一步走的距离,以保证不要步子跨的太大扯着蛋,哈哈,其实就是不要走太快,错过了最低点。同时也要保证不要走的太慢,导致太阳下山了,还没有走到山下。所以α的选择在梯度下降法中往往是很重要的!α不能太大也不能太小,太小的话,可能导致迟迟走不到最低点,太大的话,会导致错过最低点! 为什么要梯度要乘以一个负号? 梯度前加一个负号,就意味着朝着梯度相反的方向前进!我们在前文提到,梯度的方向实际就是函数在此点上升最快的方向!而我们需要朝着下降最快的方向走,自然就是负的梯度的方向,所以此处需要加上负号
梯度下降算法的实例 我们已经基本了解了梯度下降算法的计算过程,那么我们就来看几个梯度下降算法的小实例,首先从单变量的函数开始
单变量函数的梯度下降 我们假设有一个单变量的函数
函数的微分 初始化,起点为 学习率为 根据梯度下降的计算公式
我们开始进行梯度下降的迭代计算过程:
image.png
如图,经过四次的运算,也就是走了四步,基本就抵达了函数的最低点,也就是山底
多变量函数的梯度下降 我们假设有一个目标函数
现在要通过梯度下降法计算这个函数的最小值。我们通过观察就能发现最小值其实就是 (0,0)点。但是接下来,我们会从梯度下降算法开始一步步计算到这个最小值! 我们假设初始的起点为:
初始的学习率为:
函数的梯度为:
进行多次迭代:
我们发现,已经基本靠近函数的最小值点
梯度下降算法的实现 下面我们将用python实现一个简单的梯度下降算法。场景是一个简单的线性回归的例子:假设现在我们有一系列的点,如下图所示
我们将用梯度下降法来拟合出这条直线!
首先,我们需要定义一个代价函数,在此我们选用均方误差代价函数
此公式中
m是数据集中点的个数
½是一个常量,这样是为了在求梯度的时候,二次方乘下来就和这里的½抵消了,自然就没有多余的常数系数,方便后续的计算,同时对结果不会有影响
y 是数据集中每个点的真实y坐标的值
h 是我们的预测函数,根据每一个输入x,根据Θ 计算得到预测的y值,即
我们可以根据代价函数看到,代价函数中的变量有两个,所以是一个多变量的梯度下降问题,求解出代价函数的梯度,也就是分别对两个变量进行微分
明确了代价函数和梯度,以及预测的函数形式。我们就可以开始编写代码了。但在这之前,需要说明一点,就是为了方便代码的编写,我们会将所有的公式都转换为矩阵的形式,python中计算矩阵是非常方便的,同时代码也会变得非常的简洁。
为了转换为矩阵的计算,我们观察到预测函数的形式
我们有两个变量,为了对这个公式进行矩阵化,我们可以给每一个点x增加一维,这一维的值固定为1,这一维将会乘到Θ0上。这样就方便我们统一矩阵化的计算
然后我们将代价函数和梯度转化为矩阵向量相乘的形式
coding time 首先,我们需要定义数据集和学习率</description>
</item>
<item>
<title>特征工程之数据预处理</title>
<link>https://reid00.github.io/posts/ml/%E7%89%B9%E5%BE%81%E5%B7%A5%E7%A8%8B%E4%B9%8B%E6%95%B0%E6%8D%AE%E9%A2%84%E5%A4%84%E7%90%86/</link>
<pubDate>Thu, 16 Mar 2023 19:35:24 +0800</pubDate>
<guid>https://reid00.github.io/posts/ml/%E7%89%B9%E5%BE%81%E5%B7%A5%E7%A8%8B%E4%B9%8B%E6%95%B0%E6%8D%AE%E9%A2%84%E5%A4%84%E7%90%86/</guid>
<description>Summary 数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。由此可见,特征工程在机器学习中占有相当重要的地位。在实际应用当中,可以说特征工程是机器学习成功的关键。
什么是特征工程 特征工程又包含了Data PreProcessing(数据预处理)、Feature Extraction(特征提取)、Feature Selection(特征选择)和Feature construction(特征构造)等子问题,本章内容主要讨论数据预处理的方法及实现。 特征工程是机器学习中最重要的起始步骤,数据预处理是特征工程的最重要的起始步骤,而数据清洗是数据预处理的重要组成部分,会直接影响机器学习的效果。
数据清洗整体介绍 1. 箱线图分析异常值 箱线图提供了识别异常值的标准,如果一个数下雨 QL-1.5IQR or 大于OU + 1.5 IQR, 则这个值被称为异常值。
QL 下四分位数,表示四分之一的数据值比它小 QU 上四分位数,表示四分之一的数据值比它大 IRQ 四分位距,是QU-QL 的差值,包含了全部关差值的一般 2. 数据的光滑处理 除了检测出异常值然后再处理异常值外,还可以使用以下方法对异常数据进行光滑处理。
2.1. 变量分箱(即变量离散化) 离散特征的增加和减少都很容易,易于模型的快速迭代; 稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展; 离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄&gt;30是1,否则0。如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰; 逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合; 离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力; 特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。当然处于区间相邻处的样本会刚好相反,所以怎么划分区间是门学问; 特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险。 可以将缺失作为独立的一类带入模型。 将所有变量变换到相似的尺度上。 2.1.0 变量分箱的方法 2.1.1 无序变量分箱 举个例子,在实际模型建立当中,有个 job 职业的特征,取值为(“国家机关人员”,“专业技术人员”,“商业服务人员”),对于这一类变量,如果我们将其依次赋值为(国家机关人员=1;专业技术人员=2;商业服务人员=3),就很容易产生一个问题,不同种类的职业在数据层面上就有了大小顺序之分,国家机关人员和商业服务人员的差距是2,专业技术人员和商业服务人员的之间的差距是1,而我们原来的中文分类中是不存在这种先后顺序关系的。所以这么简单的赋值是会使变量失去原来的衡量效果。
怎么处理这个问题呢? “一位有效编码” (one-hot Encoding)可以解决这个问题,通常叫做虚变量或者哑变量(dummpy variable):比如职业特征有3个不同变量,那么将其生成个2哑变量,分别是“是否国家党政职业人员”,“是否专业技术人员” ,每个虚变量取值(1,0)。 为什么2个哑变量而非3个? 在模型中引入多个虚拟变量时,虚拟变量的个数应按下列原则确定: 回归模型有截距:一般的,若该特征下n个属性均互斥(如,男/女;儿童/青年/中年/老年),在生成虚拟变量时,应该生成 n-1个虚变量,这样可以避免产生多重共线性 回归模型无截距项:有n个特征,设置n个虚拟变量 python 实现方法pd.get_dummies() 2.1.2 有序变量分箱 有序多分类变量是很常见的变量形式,通常在变量中有多个可能会出现的取值,各取值之间还存在等级关系。比如高血压分级(0=正常,1=正常高值,2=1级高血压,3=2级高血压,4=3级高血压)这类变量处理起来简直不要太省心,使用 pandas 中的 map()替换相应变量就行。
1 2 3 4 5 import pandas as pd df= pd.</description>
</item>
<item>
<title>特征工程之特征选择</title>
<link>https://reid00.github.io/posts/ml/%E7%89%B9%E5%BE%81%E5%B7%A5%E7%A8%8B%E4%B9%8B%E7%89%B9%E5%BE%81%E9%80%89%E6%8B%A9/</link>
<pubDate>Thu, 16 Mar 2023 19:35:24 +0800</pubDate>
<guid>https://reid00.github.io/posts/ml/%E7%89%B9%E5%BE%81%E5%B7%A5%E7%A8%8B%E4%B9%8B%E7%89%B9%E5%BE%81%E9%80%89%E6%8B%A9/</guid>
<description>Summary 数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。由此可见,特征工程在机器学习中占有相当重要的地位。在实际应用当中,可以说特征工程是机器学习成功的关键。
那特征工程是什么?
特征工程是利用数据领域的相关知识来创建能够使机器学习算法达到最佳性能的特征的过程。
特征工程又包含了Feature Selection(特征选择)、Feature Extraction(特征提取)和Feature construction(特征构造)等子问题,本章内容主要讨论特征选择相关的方法及实现。
在实际项目中,我们可能会有大量的特征可使用,有的特征携带的信息丰富,有的特征携带的信息有重叠,有的特征则属于无关特征,如果所有特征不经筛选地全部作为训练特征,经常会出现维度灾难问题,甚至会降低模型的准确性。因此,我们需要进行特征筛选,排除无效/冗余的特征,把有用的特征挑选出来作为模型的训练数据。
特征选择介绍 特征按重要性分类 相关特征
对于学习任务(例如分类问题)有帮助,可以提升学习算法的效果
无关特征
对于我们的算法没有任何帮助,不会给算法的效果带来任何提升
冗余特征
不会对我们的算法带来新的信息,或者这种特征的信息可以由其他的特征推断出
特征选择的目的 对于一个特定的学习算法来说,哪一个特征是有效的是未知的。因此,需要从所有特征中选择出对于学习算法有益的相关特征。而且在实际应用中,经常会出现维度灾难问题。如果只选择所有特征中的部分特征构建模型,那么可以大大减少学习算法的运行时间,也可以增加模型的可解释性
特征选择的原则 获取尽可能小的特征子集,不显著降低分类精度、不影响分类分布以及特征子集应具有稳定、适应性强等特点
特征选择的方法 Filter 方法(过滤式) 先进行特征选择,然后去训练学习器,所以特征选择的过程与学习器无关。相当于先对特征进行过滤操作,然后用特征子集来训练分类器。
**主要思想:**对每一维特征“打分”,即给每一维的特征赋予权重,这样的权重就代表着该特征的重要性,然后依据权重排序。
主要方法:
卡方检验 信息增益 相关系数 优点: 运行速度快,是一种非常流行的特征选择方法。
**缺点:**无法提供反馈,特征选择的标准/规范的制定是在特征搜索算法中完成,学习算法无法向特征搜索算法传递对特征的需求。另外,可能处理某个特征时由于任意原因表示该特征不重要,但是该特征与其他特征结合起来则可能变得很重要。
Wrapper 方法 (封装式) 直接把最后要使用的分类器作为特征选择的评价函数,对于特定的分类器选择最优的特征子集。
主要思想: 将子集的选择看作是一个搜索寻优问题,生成不同的组合,对组合进行评价,再与其他的组合进行比较。这样就将子集的选择看作是一个优化问题,这里有很多的优化算法可以解决,尤其是一些启发式的优化算法,如GA、PSO(如:优化算法-粒子群算法)、DE、ABC(如:优化算法-人工蜂群算法)等。
主要方法:
递归特征消除算法 优点: 对特征进行搜索时围绕学习算法展开的,对特征选择的标准/规范是在学习算法的需求中展开的,能够考虑学习算法所属的任意学习偏差,从而确定最佳子特征,真正关注的是学习问题本身。由于每次尝试针对特定子集时必须运行学习算法,所以能够关注到学习算法的学习偏差/归纳偏差,因此封装能够发挥巨大的作用。
缺点: 运行速度远慢于过滤算法,实际应用用封装方法没有过滤方法流行。
Embedded 方法(嵌入式) 将特征选择嵌入到模型训练当中,其训练可能是相同的模型,但是特征选择完成后,还能给予特征选择完成的特征和模型训练出的超参数,再次训练优化。
主要思想: 在模型既定的情况下学习出对提高模型准确性最好的特征。也就是在确定模型的过程中,挑选出那些对模型的训练有重要意义的特征。
主要方法: 用带有L1正则化的项完成特征选择(也可以结合L2惩罚项来优化)、随机森林平均不纯度减少法/平均精确度减少法。
优点: 对特征进行搜索时围绕学习算法展开的,能够考虑学习算法所属的任意学习偏差。训练模型的次数小于Wrapper方法,比较节省时间。
缺点: 运行速度慢
特征选择的实现方法 从两个方面考虑来选择特征: 特征是否发散: 如果一个特征不发散,例如方差接近于0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么用。
假设某特征的特征值只有0和1,并且在所有输入样本中,95%的实例的该特征取值都是1,那就可以认为这个特征作用不大。如果100%都是1,那这个特征就没意义了。
**特征与目标的相关性:**这点比较显见,与目标相关性高的特征,应当优选选择。除方差法外,本文介绍的其他方法均从相关性考虑。
Filter: 卡方检验 经典的卡方检验是检验定性自变量对定性因变量的相关性。假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望的差距,构建统计量:
不难发现,这个统计量的含义简而言之就是自变量对因变量的相关性。用feature_selection库的SelectKBest类结合卡方检验来选择特征的代码如下:
1 2 3 4 5 from sklearn.</description>
</item>
<item>
<title>机器学习之常见损失函数</title>
<link>https://reid00.github.io/posts/ml/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E4%B9%8B%E5%B8%B8%E8%A7%81%E6%8D%9F%E5%A4%B1%E5%87%BD%E6%95%B0/</link>
<pubDate>Thu, 16 Mar 2023 19:35:23 +0800</pubDate>
<guid>https://reid00.github.io/posts/ml/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E4%B9%8B%E5%B8%B8%E8%A7%81%E6%8D%9F%E5%A4%B1%E5%87%BD%E6%95%B0/</guid>
<description>简介 损失函数用来评价模型的预测值和真实值不一样的程度,损失函数越好,通常模型的性能越好。不同的模型用的损失函数一般也不一样。
损失函数分为经验风险损失函数和结构风险损失函数。经验风险损失函数指预测结果和实际结果的差别,结构风险损失函数是指经验风险损失函数加上正则项。
常见的损失函数以及其优缺点如下:
1. 0-1损失函数(zero-one loss) 0-1损失是指预测值和目标值不相等为1, 否则为0:
特点:
(1) 0-1损失函数直接对应分类判断错误的个数,但是它是一个非凸函数,不太适用.
(2) 感知机就是用的这种损失函数。但是相等这个条件太过严格,因此可以放宽条件,即满足 时认为相等,
2. 绝对值损失函数 绝对值损失函数是计算预测值与目标值的差的绝对值:
3. log对数损失函数 log对数损失函数的标准形式如下:
特点:
(1) log对数损失函数能非常好的表征概率分布,在很多场景尤其是多分类,如果需要知道结果属于每个类别的置信度,那它非常适合。
(2) 健壮性不强,相比于hinge loss对噪声更敏感。
(3) 辑回归的损失函数就是log对数损失函数。
4. 平方损失函数 平方损失函数标准形式如下:
特点:
(1)经常应用与回归问题
5. 指数损失函数(exponential loss) 指数损失函数的标准形式如下:
特点:
(1)对离群点、噪声非常敏感。经常用在AdaBoost算法中。
6. Hinge 损失函数 Hinge损失函数标准形式如下:
特点:
(1) hinge损失函数表示如果被分类正确,损失为0,否则损失就为 。SVM就是使用这个损失函数。
(2) 一般的 是预测值,在-1到1之间, 是目标值(-1或1)。其含义是, 的值在-1和+1之间就可以了,并不鼓励 ,即并不鼓励分类器过度自信,让某个正确分类的样本距离分割线超过1并不会有任何奖励,从而使分类器可以更专注于整体的误差。
(3) 健壮性相对较高,对异常点、噪声不敏感,但它没太好的概率解释。
7. 感知损失(perceptron loss)函数 感知损失函数的标准形式如下:
特点:
(1)是Hinge损失函数的一个变种,Hinge loss对判定边界附近的点(正确端)惩罚力度很高。而perceptron loss只要样本的判定类别正确的话,它就满意,不管其判定边界的距离。它比Hinge loss简单,因为不是max-margin boundary,所以模型的泛化能力没 hinge loss强。
8. 交叉熵损失函数 (Cross-entropy loss function) 交叉熵损失函数的标准形式如下:</description>
</item>
<item>
<title>机器学习面试题</title>
<link>https://reid00.github.io/posts/ml/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E9%9D%A2%E8%AF%95%E9%A2%98/</link>
<pubDate>Thu, 16 Mar 2023 19:35:23 +0800</pubDate>
<guid>https://reid00.github.io/posts/ml/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E9%9D%A2%E8%AF%95%E9%A2%98/</guid>
<description>1. 无监督和有监督的区别? 有监督学习:对具有概念标记(分类)的训练样本进行学习,以尽可能对训练样本集外的数据进行标记(分类)预测。这里,所有的标记(分类)是已知的。因此,训练样本的岐义性低。
无监督学习:对没有概念标记(分类)的训练样本进行学习,以发现训练样本集中的结构性知识。这里,所有的标记(分类)是未知的。因此,训练样本的岐义性高。聚类就是典型的无监督学习。
2. SVM 的推导,特性?多分类怎么处理? SVM是最大间隔分类器,几何间隔和样本的误分次数之间存在关系,,其中从线性可分情况下,原问题,特征转换后的dual问题,引入kernel(线性kernel,多项式,高斯),最后是soft margin。
线性:简单,速度快,但是需要线性可分。
多项式:比线性核拟合程度更强,知道具体的维度,但是高次容易出现数值不稳定,参数选择比较多。
高斯:拟合能力最强,但是要注意过拟合问题。不过只有一个参数需要调整。
多分类问题,一般将二分类推广到多分类的方式有三种,一对一,一对多,多对多。
一对一:将N个类别两两配对,产生N(N-1)/2个二分类任务,测试阶段新样本同时交给所有的分类器,最终结果通过投票产生。
一对多:每一次将一个例作为正例,其他的作为反例,训练N个分类器,测试时如果只有一个分类器预测为正类,则对应类别为最终结果,如果有多个,则一般选择置信度最大的。从分类器角度一对一更多,但是每一次都只用了2个类别,因此当类别数很多的时候一对一开销通常更小(只要训练复杂度高于O(N)即可得到此结果)。
多对多:若干各类作为正类,若干个类作为反类。注意正反类必须特殊的设计。
3. LR 的推导,特性? LR的优点在于实现简单,并且计算量非常小,速度很快,存储资源低,缺点就是因为模型简单,对于复杂的情况下会出现欠拟合,并且只能处理2分类问题(可以通过一般的二元转换为多元或者用softmax回归)。
4. 决策树的特性? 决策树基于树结构进行决策,与人类在面临问题的时候处理机制十分类似。其特点在于需要选择一个属性进行分支,在分支的过程中选择信息增益最大的属性,定义如下 在划分中我们希望决策树的分支节点所包含的样本属于同一类别,即节点的纯度越来越高。决策树计算量简单,可解释性强,比较适合处理有缺失属性值的样本,能够处理不相关的特征,但是容易过拟合,需要使用剪枝或者随机森林。信息增益是熵减去条件熵,代表信息不确定性较少的程度,信息增益越大,说明不确定性降低的越大,因此说明该特征对分类来说很重要。由于信息增益准则会对数目较多的属性有所偏好,因此一般用信息增益率(c4.5)
其中分母可以看作为属性自身的熵。取值可能性越多,属性的熵越大。
Cart决策树使用基尼指数来选择划分属性,直观的来说,Gini(D)反映了从数据集D中随机抽取两个样本,其类别标记不一致的概率,因此基尼指数越小数据集D的纯度越高,一般为了防止过拟合要进行剪枝,有预剪枝和后剪枝,一般用cross validation集进行剪枝。
连续值和缺失值的处理,对于连续属性a,将a在D上出现的不同的取值进行排序,基于划分点t将D分为两个子集。一般对每一个连续的两个取值的中点作为划分点,然后根据信息增益选择最大的。与离散属性不同,若当前节点划分属性为连续属性,该属性还可以作为其后代的划分属性。
5. SVM,LR,决策树对比? SVM既可以用于分类问题,也可以用于回归问题,并且可以通过核函数快速的计算,LR实现简单,训练速度非常快,但是模型较为简单,决策树容易过拟合,需要进行剪枝等。从优化函数上看,soft margin的SVM用的是hinge loss,而带L2正则化的LR对应的是cross entropy loss,另外adaboost对应的是exponential loss。所以LR对远点敏感,但是SVM对outlier不太敏感,因为只关心support vector,SVM可以将特征映射到无穷维空间,但是LR不可以,一般小数据中SVM比LR更优一点,但是LR可以预测概率,而SVM不可以,SVM依赖于数据测度,需要先做归一化,LR一般不需要,对于大量的数据LR使用更加广泛,LR向多分类的扩展更加直接,对于类别不平衡SVM一般用权重解决,即目标函数中对正负样本代价函数不同,LR可以用一般的方法,也可以直接对最后结果调整(通过阈值),一般小数据下样本维度比较高的时候SVM效果要更优一些。
6. GBDT 和随机森林的区别? 随机森林采用的是bagging的思想,bagging又称为bootstrap aggreagation,通过在训练样本集中进行有放回的采样得到多个采样集,基于每个采样集训练出一个基学习器,再将基学习器结合。随机森林在对决策树进行bagging的基础上,在决策树的训练过程中引入了随机属性选择。传统决策树在选择划分属性的时候是在当前节点属性集合中选择最优属性,而随机森林则是对结点先随机选择包含k个属性的子集,再选择最有属性,k作为一个参数控制了随机性的引入程度。
另外,GBDT训练是基于Boosting思想,每一迭代中根据错误更新样本权重,因此是串行生成的序列化方法,而随机森林是bagging的思想,因此是并行化方法。
7. 如何判断函数凸或非凸?什么是凸优化? 首先定义凸集,如果x,y属于某个集合C,并且所有的也属于c,那么c为一个凸集,进一步,如果一个函数其定义域是凸集,并且
则该函数为凸函数。上述条件还能推出更一般的结果,
如果函数有二阶导数,那么如果函数二阶导数为正,或者对于多元函数,Hessian矩阵半正定则为凸函数。
(也可能引到SVM,或者凸函数局部最优也是全局最优的证明,或者上述公式期望情况下的Jessen不等式)
8. 如何解决类别不平衡问题? 有些情况下训练集中的样本分布很不平衡,例如在肿瘤检测等问题中,正样本的个数往往非常的少。从线性分类器的角度,在用对新样本进行分类的时候,事实上在用预测出的y值和一个y值进行比较,例如常常在y&gt;0.5的时候判为正例,否则判为反例。几率反映了正例可能性和反例可能性的比值,阈值0.5恰好表明分类器认为正反的可能性相同。在样本不均衡的情况下,应该是分类器的预测几率高于观测几率就判断为正例,因此应该是时预测为正例,这种策略称为rebalancing。但是训练集并不一定是真实样本总体的无偏采样,通常有三种做法,一种是对训练集的负样本进行欠采样,第二种是对正例进行升采样,第三种是直接基于原始训练集进行学习,在预测的时候再改变阈值,称为阈值移动。注意过采样一般通过对训练集的正例进行插值产生额外的正例,而欠采样将反例划分为不同的集合供不同的学习器使用。
9. 解释对偶的概念。 一个优化问题可以从两个角度进行考察,一个是primal 问题,一个是dual 问题,就是对偶问题,一般情况下对偶问题给出主问题最优值的下界,在强对偶性成立的情况下由对偶问题可以得到主问题的最优下界,对偶问题是凸优化问题,可以进行较好的求解,SVM中就是将primal问题转换为dual问题进行求解,从而进一步引入核函数的思想。
10. 如何进行特征选择 ? 特征选择是一个重要的数据预处理过程,主要有两个原因,首先在现实任务中我们会遇到维数灾难的问题(样本密度非常稀疏),若能从中选择一部分特征,那么这个问题能大大缓解,另外就是去除不相关特征会降低学习任务的难度,增加模型的泛化能力。冗余特征指该特征包含的信息可以从其他特征中推演出来,但是这并不代表该冗余特征一定没有作用,例如在欠拟合的情况下也可以用过加入冗余特征,增加简单模型的复杂度。
在理论上如果没有任何领域知识作为先验假设那么只能遍历所有可能的子集。但是这显然是不可能的,因为需要遍历的数量是组合爆炸的。一般我们分为子集搜索和子集评价两个过程,子集搜索一般采用贪心算法,每一轮从候选特征中添加或者删除,分别成为前向和后先搜索。或者两者结合的双向搜索。子集评价一般采用信息增益,对于连续数据往往排序之后选择中点作为分割点。
常见的特征选择方式有过滤式,包裹式和嵌入式,filter,wrapper和embedding。Filter类型先对数据集进行特征选择,再训练学习器。Wrapper直接把最终学习器的性能作为特征子集的评价准则,一般通过不断候选子集,然后利用cross-validation过程更新候选特征,通常计算量比较大。嵌入式特征选择将特征选择过程和训练过程融为了一体,在训练过程中自动进行了特征选择,例如L1正则化更易于获得稀疏解,而L2正则化更不容易过拟合。L1正则化可以通过PGD,近端梯度下降进行求解。
11. 为什么会产生过拟合,有哪些方法可以预防或克服过拟合? 一般在机器学习中,将学习器在训练集上的误差称为训练误差或者经验误差,在新样本上的误差称为泛化误差。显然我们希望得到泛化误差小的学习器,但是我们事先并不知道新样本,因此实际上往往努力使经验误差最小化。然而,当学习器将训练样本学的太好的时候,往往可能把训练样本自身的特点当做了潜在样本具有的一般性质。这样就会导致泛化性能下降,称之为过拟合,相反,欠拟合一般指对训练样本的一般性质尚未学习好,在训练集上仍然有较大的误差。
欠拟合:一般来说欠拟合更容易解决一些,例如增加模型的复杂度,增加决策树中的分支,增加神经网络中的训练次数等等。根本的原因是特征维度过少,导致拟合的函数无法满足训练集,误差较大。
欠拟合问题可以通过增加特征维度来解决。可以考虑加入进特征组合、高次特征,来增大假设空间;
添加多项式特征,这个在机器学习算法里面用的很普遍,例如将线性模型通过添加二次项或者三次项使模型泛化能力更强
减少正则化参数,正则化的目的是用来防止过拟合的,但是现在模型出现了欠拟合,则需要减少正则化参数</description>
</item>
<item>
<title>最常考的正则问题L1L2</title>
<link>https://reid00.github.io/posts/ml/%E6%9C%80%E5%B8%B8%E8%80%83%E7%9A%84%E6%AD%A3%E5%88%99%E9%97%AE%E9%A2%98l1l2/</link>
<pubDate>Thu, 16 Mar 2023 19:35:22 +0800</pubDate>
<guid>https://reid00.github.io/posts/ml/%E6%9C%80%E5%B8%B8%E8%80%83%E7%9A%84%E6%AD%A3%E5%88%99%E9%97%AE%E9%A2%98l1l2/</guid>
<description>正则化也是校招中常考的题目之一,在去年的校招中,被问到了多次:
1、过拟合的解决方式有哪些,l1和l2正则化都有哪些不同,各自有什么优缺点(爱奇艺) 2、L1和L2正则化来避免过拟合是大家都知道的事情,而且我们都知道L1正则化可以得到稀疏解,L2正则化可以得到平滑解,这是为什么呢? 3、L1和L2有什么区别,从数学角度解释L2为什么能提升模型的泛化能力。(美团) 4、L1和L2的区别,以及各自的使用场景(头条)
接下来,咱们就针对上面的几个问题,进行针对性回答!
Link: https://mp.weixin.qq.com/s/t4vRBZXhc0LBST8WGzftgg</description>
</item>
<item>
<title>朴素贝叶斯</title>
<link>https://reid00.github.io/posts/ml/%E6%9C%B4%E7%B4%A0%E8%B4%9D%E5%8F%B6%E6%96%AF/</link>
<pubDate>Thu, 16 Mar 2023 19:35:22 +0800</pubDate>
<guid>https://reid00.github.io/posts/ml/%E6%9C%B4%E7%B4%A0%E8%B4%9D%E5%8F%B6%E6%96%AF/</guid>
<description>贝叶斯准备知识 贝叶斯决策论是概率框架下实施决策的基本方法。要了解贝叶斯决策论,首先得先了解以下几个概念:先验概率、条件概率、后验概率、误判损失、条件风险、贝叶斯判别准则
先验概率: 所谓先验概率,就是根据以往的经验或者现有数据的分析所得到的概率。如,随机扔一枚硬币,则p(正面) = p(反面) = 1/2,这是我们根据已知的知识所知道的信息,即p(正面) = 1/2为先验概率。
条件概率: 所谓条件概率是指事件A在另一事件B发生的条件下发送的概率。用数学符号表示为:P(B\|A),即B在A发生的条件下发生的概率。举个栗子,你早上误喝了一瓶过期了的牛奶(A),那我们来算一下你今天拉肚子的概率(B),这个就叫做条件概率。即P(拉肚子\|喝了过期牛奶), 易见,条件概率是有因求果(知道原因推测结果)。
后验概率: 后验概率跟条件概率的表达形式有点相似。数学表达式为p(A\|B), 即A在B发生的条件下发生的概率。以误喝牛奶的例子为例,现在知道了你今天拉肚子了(B),算一下你早上误喝了一瓶过期了的牛奶(A)的概率, 即P(A|B),这就是后验概率,后验概率是有果求因(知道结果推出原因)
误判损失: 数学表达式:L(j|i), 判别损失表示把一个标记为i类的样本误分类为j类所造成的损失。 比如,当你去参加体检时,明明你各项指标都是正常的,但是医生却把你分为癌症病人,这就造成了误判损失,用数学表示为:L(癌症|正常)。
条件风险: 是指基于后验概率P(i|x)可获得将样本x分类为i所产生的期望损失,公式为:R(i|x) = ∑L(i|j)P(j|x)。(其实就是所有判别损失的加权和,而这个权就是样本判为j类的概率,样本本来应该含有P(j|x)的概率判为j类,但是却判为了i类,这就造成了错判损失,而将所有的错判损失与正确判断的概率的乘积相加,就能得到样本错判为i类的平均损失,即条件风险。)
举个栗子,假设把癌症病人判为正常人的误判损失是100,把正常人判为癌症病人的误判损失是10,把感冒病人判为癌症的误判损失是8,即L(正常|癌症) = 100, L(癌症|正常) = 10,L(癌症|感冒) = 8, 现在,我们经过计算知道有一个来体检的员工的后验概率分别为:p(正常|各项指标) = 0.2, p(感冒|各项指标) = 0.4, p( 癌症|各项指标)=0.4。假如我们需要计算将这个员工判为癌症的条件风险,则:R(癌症|各项指标) = L(癌症|正常) p(正常|各项指标) + L(癌症|感冒) * p(感冒|各项指标) = 5.2。*
贝叶斯判别准则:
贝叶斯判别准则是找到一个使条件风险达到最小的判别方法。即,将样本判为哪一类,所得到的条件风险R(i|x)(或者说平均判别损失)最小,那就将样本归为那个造成平均判别损失最小的类。
此时:h*(x) = argminR(i|x) 就称为 贝叶斯最优分类器。
总结:贝叶斯决策论是基于先验概率求解后验概率的方法,其核心是寻找一个判别准则使得条件风险达到最小。而在最小化分类错误率的目标下,贝叶斯最优分类器又可以转化为求后验概率达到最大的类别标记,即 h*(x) = argmaxP(i|x)。(此时,L(i|j) = 0, if i = j;L(i|j) = 1, otherwise)</description>
</item>
<item>
<title>机器学习之优化算法</title>
<link>https://reid00.github.io/posts/ml/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E4%B9%8B%E4%BC%98%E5%8C%96%E7%AE%97%E6%B3%95/</link>
<pubDate>Thu, 16 Mar 2023 19:35:22 +0800</pubDate>
<guid>https://reid00.github.io/posts/ml/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E4%B9%8B%E4%BC%98%E5%8C%96%E7%AE%97%E6%B3%95/</guid>
<description>在调整模型更新权重和偏差参数的方式时,你是否考虑过哪种优化算法能使模型产生更好且更快的效果?应该用梯度下降,随机梯度下降,还是Adam方法?
这篇文章介绍了不同优化算法之间的主要区别,以及如何选择最佳的优化方法。
梯度: 是多元函数对当前给定点,上升最快的方向。梯度是一组向量,所以带有方向;
梯度下降流程: https://zhuanlan.zhihu.com/p/68468520 w, b 每轮是每个样本的权重梯度向量和偏差梯度向量的平均值;
梯度下降本质是沿着负梯度值方向寻找损失函数Loss的最小值解 时的参数w,b , 从而得出对样本数据拟合最好的参数w,b。 https://www.jianshu.com/p/c7e642877b0e
什么是优化算法? 优化算法的功能,是通过改善训练方式,来最小化(或最大化)损失函数E(x)。
模型内部有些参数,是用来计算测试集中目标值Y的真实值和预测值的偏差程度的,基于这些参数,就形成了损失函数E(x)。
比如说,权重(W)和偏差(b)就是这样的内部参数,一般用于计算输出值,在训练神经网络模型时起到主要作用。
**在有效地训练模型并产生准确结果时,模型的内部参数起到了非常重要的作用。**这也是为什么我们应该用各种优化策略和算法,来更新和计算影响模型训练和模型输出的网络参数,使其逼近或达到最优值。
优化算法分为两大类:
1. 一阶优化算法
这种算法使用各参数的梯度值来最小化或最大化损失函数E(x)。最常用的一阶优化算法是梯度下降。
函数梯度:导数dy/dx的多变量表达式,用来表示y相对于x的瞬时变化率。往往为了计算多变量函数的导数时,会用梯度取代导数,并使用偏导数来计算梯度。梯度和导数之间的一个主要区别是函数的梯度形成了一个向量场。
因此,对单变量函数,使用导数来分析;而梯度是基于多变量函数而产生的。更多理论细节在这里不再进行详细解释。
2. 二阶优化算法
二阶优化算法使用了二阶导数(也叫做Hessian方法)来最小化或最大化损失函数。由于二阶导数的计算成本很高,所以这种方法并没有广泛使用。
详解各种神经网络优化算法 梯度下降 在训练和优化智能系统时,梯度下降是一种最重要的技术和基础。梯度下降的功能是:
通过寻找最小值,控制方差,更新模型参数,最终使模型收敛。
网络更新参数的公式为:θ=θ−η×∇(θ).J(θ) ,其中η是学习率,∇(θ).J(θ)是损失函数J(θ)的梯度。
这是在神经网络中最常用的优化算法。
如今,梯度下降主要用于在神经网络模型中进行权重更新,即在一个方向上更新和调整模型的参数,来最小化损失函数。
2006年引入的反向传播技术,使得训练深层神经网络成为可能。反向传播技术是先在前向传播中计算输入信号的乘积及其对应的权重,然后将激活函数作用于这些乘积的总和。这种将输入信号转换为输出信号的方式,是一种对复杂非线性函数进行建模的重要手段,并引入了非线性激活函数,使得模型能够学习到几乎任意形式的函数映射。然后,在网络的反向传播过程中回传相关误差,使用梯度下降更新权重值,通过计算误差函数E相对于权重参数W的梯度,在损失函数梯度的相反方向上更新权重参数。
**图1:**权重更新方向与梯度方向相反 图1显示了权重更新过程与梯度矢量误差的方向相反,其中U形曲线为梯度。要注意到,当权重值W太小或太大时,会存在较大的误差,需要更新和优化权重,使其转化为合适值,所以我们试图在与梯度相反的方向找到一个局部最优值。
梯度下降的变体 传统的批量梯度下降将计算整个数据集梯度,但只会进行一次更新,因此在处理大型数据集时速度很慢且难以控制,甚至导致内存溢出。
权重更新的快慢是由学习率η决定的,并且可以在凸面误差曲面中收敛到全局最优值,在非凸曲面中可能趋于局部最优值。
使用标准形式的批量梯度下降还有一个问题,就是在训练大型数据集时存在冗余的权重更新。
标准梯度下降的上述问题在随机梯度下降方法中得到了解决。
1. 随机梯度下降(SDG)
随机梯度下降(Stochastic gradient descent,SGD)对每个训练样本进行参数更新,每次执行都进行一次更新,且执行速度更快。
θ=θ−η⋅∇(θ) × J(θ;x(i);y(i)),其中x(i)和y(i)为训练样本。
频繁的更新使得参数间具有高方差,损失函数会以不同的强度波动。这实际上是一件好事,因为它有助于我们发现新的和可能更优的局部最小值,而标准梯度下降将只会收敛到某个局部最优值。
但SGD的问题是,由于频繁的更新和波动,最终将收敛到最小限度,并会因波动频繁存在超调量。
虽然已经表明,当缓慢降低学习率η时,标准梯度下降的收敛模式与SGD的模式相同。
**图2:**每个训练样本中高方差的参数更新会导致损失函数大幅波动,因此我们可能无法获得给出损失函数的最小值。 另一种称为“小批量梯度下降”的变体,则可以解决高方差的参数更新和不稳定收敛的问题。
2. 小批量梯度下降
为了避免SGD和标准梯度下降中存在的问题,一个改进方法为小批量梯度下降(Mini Batch Gradient Descent),因为对每个批次中的n个训练样本,这种方法只执行一次更新。
使用小批量梯度下降的优点是:
1) 可以减少参数更新的波动,最终得到效果更好和更稳定的收敛。
2) 还可以使用最新的深层学习库中通用的矩阵优化方法,使计算小批量数据的梯度更加高效。
3) 通常来说,小批量样本的大小范围是从50到256,可以根据实际问题而有所不同。</description>
</item>
<item>
<title>常见距离的介绍</title>
<link>https://reid00.github.io/posts/ml/%E5%B8%B8%E8%A7%81%E8%B7%9D%E7%A6%BB%E7%9A%84%E4%BB%8B%E7%BB%8D/</link>
<pubDate>Thu, 16 Mar 2023 19:35:21 +0800</pubDate>
<guid>https://reid00.github.io/posts/ml/%E5%B8%B8%E8%A7%81%E8%B7%9D%E7%A6%BB%E7%9A%84%E4%BB%8B%E7%BB%8D/</guid>
<description>机器学习常见距离介绍 1. 欧式距离 2. 曼哈顿距离 我们可以定义曼哈顿距离的正式意义为L1-距离或城市区块距离,也就是在欧几里得空间的固定直角坐标系上两点所形成的线段对轴产生的投影的距离总和。例如在平面上,坐标(x1, y1)的点P1与坐标(x2, y2)的点P2的曼哈顿距离为:,要注意的是,曼哈顿距离依赖座标系统的转度,而非系统在座标轴上的平移或映射。 通俗来讲,想象你在曼哈顿要从一个十字路口开车到另外一个十字路口,驾驶距离是两点间的直线距离吗?显然不是,除非你能穿越大楼。而实际驾驶距离就是这个“曼哈顿距离”,此即曼哈顿距离名称的来源, 同时,曼哈顿距离也称为城市街区距离(City Block distance)。
3. 切比雪夫距离 若二个向量或二个点p 、and q,其座标分别为p1,p2 4. 闵可夫斯基距离(Minkowski Distance) 闵氏距离不是一种距离,而是一组距离的定义.
(1) 闵氏距离的定义 两个n维变量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的闵可夫斯基距离定义为: 其中p是一个变参数。 当p=1时,就是曼哈顿距离 当p=2时,就是欧氏距离 当p→∞时,就是切比雪夫距离 根据变参数的不同,闵氏距离可以表示一类的距离。
5. 标准化欧氏距离 (Standardized Euclidean distance ) 标准化欧氏距离是针对简单欧氏距离的缺点而作的一种改进方案。标准欧氏距离的思路:既然数据各维分量的分布不一样,那先将各个分量都“标准化”到均值、方差相等。至于均值和方差标准化到多少,先复习点统计学知识。
假设样本集X的数学期望或均值(mean)为m,标准差(standard deviation,方差开根)为s,那么X的“标准化变量”X*表示为:(X-m)/s,而且标准化变量的数学期望为0,方差为1。
即,样本集的标准化过程(standardization)用公式描述就是: 标准化后的值 = ( 标准化前的值 - 分量的均值 ) /分量的标准差 经过简单的推导就可以得到两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的标准化欧氏距离的公式: 如果将方差的倒数看成是一个权重,这个公式可以看成是一种加权欧氏距离(Weighted Euclidean distance)。
6. 马氏距离(Mahalanobis Distance) 有M个样本向量X1~Xm,协方差矩阵记为S,均值记为向量μ,则其中样本向量X到u的马氏距离表示为: (协方差矩阵中每个元素是各个矢量元素之间的协方差Cov(X,Y),Cov(X,Y) = E{ [X-E(X)] [Y-E(Y)]},其中E为数学期望)
而其中向量Xi与Xj之间的马氏距离定义为:
若协方差矩阵是单位矩阵(各个样本向量之间独立同分布),则公式就成了: 也就是欧氏距离了。 若协方差矩阵是对角矩阵,公式变成了标准化欧氏距离。
马氏距离的优缺点:量纲无关,排除变量之间的相关性的干扰。 「微博上的seafood高清版点评道:原来马氏距离是根据协方差矩阵演变,一直被老师误导了,怪不得看Killian在05年NIPS发表的LMNN论文时候老是看到协方差矩阵和半正定,原来是这回事」 7.巴氏距离(Bhattacharyya Distance) 在统计中,Bhattacharyya距离测量两个离散或连续概率分布的相似性。它与衡量两个统计样品或种群之间的重叠量的Bhattacharyya系数密切相关。Bhattacharyya距离和Bhattacharyya系数以20世纪30年代曾在印度统计研究所工作的一个统计学家A.</description>
</item>
<item>
<title>数据降维之主成分分析 PCA</title>
<link>https://reid00.github.io/posts/ml/%E6%95%B0%E6%8D%AE%E9%99%8D%E7%BB%B4%E4%B9%8B%E4%B8%BB%E6%88%90%E5%88%86%E5%88%86%E6%9E%90-pca/</link>
<pubDate>Thu, 16 Mar 2023 19:35:21 +0800</pubDate>
<guid>https://reid00.github.io/posts/ml/%E6%95%B0%E6%8D%AE%E9%99%8D%E7%BB%B4%E4%B9%8B%E4%B8%BB%E6%88%90%E5%88%86%E5%88%86%E6%9E%90-pca/</guid>
<description>Summary PCA 是无监督学习中最常见的数据降维方法,但是实际上问题特征很多的情况,PCA通常会预处理来减少特征个数。
将维的意义: 通过降维提高算法的效率 通过降维更方便数据的可视化,通过可视化我们可以更好的理解数据
相关统计概念 均值: 述的是样本集合的中间点。 方差: 概率论和统计方差衡量随机变量或一组数据时离散程度的度量。 标准差:而标准差给我们描述的是样本集合的各个样本点到均值的距离之平均。方差开根号。 标准差和方差一般是用来描述一维数据的 协方差: (多维)度量两个随机变量关系的统计量,来度量各个维度偏离其均值的程度。 协方差矩阵: (多维)度量各个维度偏离其均值的程度 当 cov(X, Y)&gt;0时,表明X与Y正相关(X越大,Y也越大;X越小Y,也越小。) 当 cov(X, Y)&lt;0时,表明X与Y负相关; 当 cov(X, Y)=0时,表明X与Y不相关。 cov协方差=[(x1-x均值)(y1-y均值)+(x2-x均值)(y2-y均值)+&hellip;+(xn-x均值)*(yn-y均值)]/(n-1) PCA 思想 对数据进行归一化处理(代码中并非这么做的,而是直接减去均值) 计算归一化后的数据集的协方差矩阵 计算协方差矩阵的特征值和特征向量 将特征值排序 保留前N个最大的特征值对应的特征向量 将数据转换到上面得到的N个特征向量构建的新空间中(实现了特征压缩) 简述主成分分析PCA工作原理,以及PCA的优缺点? PCA旨在找到数据中的主成分,并利用这些主成分表征原始数据,从而达到降维的目的。
工作原理可由两个角度解释,第一个是最大化投影方差(让数据在主轴上投影的方差尽可能大);第二个是最小化平方误差(样本点到超平面的垂直距离足够近)。
做法是数据中心化之后,对样本数据协方差矩阵进行特征分解,选取前d个最大的特征值对应的特征向量,即可将数据从原来的p维降到d维,也可根据奇异值分解来求解主成分。
优点: 1.计算简单,易于实现
2.各主成分之间正交,可消除原始数据成分间的相互影响的因素
3.仅仅需要以方差衡量信息量,不受数据集以外的因素影响
4.降维维数木有限制,可根据需要制定
缺点: 1.无法利用类别的先验信息
2.降维后,只与数据有关,主成分各个维度的含义模糊,不易于解释
3.方差小的非主成分也可能含有对样本差异的重要信息,因降维丢弃可能对后续数据处理有影响
4.线性模型,对于复杂数据集难以处理(可用核映射方式改进)
PCA中有第一主成分、第二主成分,它们分别是什么,又是如何确定的? 主成分分析是设法将原来众多具有一定相关性(比如P个指标),重新组合成一组新的互相无关的综合指标来代替原来的指标。主成分分析,是考察多个变量间相关性一种多元统计方法,研究如何通过少数几个主成分来揭示多个变量间的内部结构,即从原始变量中导出少数几个主成分,使它们尽可能多地保留原始变量的信息,且彼此间互不相关,通常数学上的处理就是将原来P个指标作线性组合,作为新的综合指标。
最经典的做法就是用F1(选取的第一个线性组合,即第一个综合指标)的方差来表达,即Var(F1)越大,表示F1包含的信息越多。因此在所有的线性组合中选取的F1应该是方差最大的,故称F1为第一主成分。如果第一主成分不足以代表原来P个指标的信息,再考虑选取F2即选第二个线性组合,为了有效地反映原来信息,F1已有的信息就不需要再出现在F2中,用数学语言表达就是要求Cov(F1, F2)=0,则称F2为第二主成分,依此类推可以构造出第三、第四,……,第P个主成分。
LDA与PCA都是常用的降维方法,二者的区别 它其实是对数据在高维空间下的一个投影转换,通过一定的投影规则将原来从一个角度看到的多个维度映射成较少的维度。到底什么是映射,下面的图就可以很好地解释这个问题——正常角度看是两个半椭圆形分布的数据集,但经过旋转(映射)之后是两条线性分布数据集。
LDA与PCA都是常用的降维方法,二者的区别在于:
**出发思想不同。**PCA主要是从特征的协方差角度,去找到比较好的投影方式,即选择样本点投影具有最大方差的方向( 在信号处理中认为信号具有较大的方差,噪声有较小的方差,信噪比就是信号与噪声的方差比,越大越好。);而LDA则更多的是考虑了分类标签信息,寻求投影后不同类别之间数据点距离更大化以及同一类别数据点距离最小化,即选择分类性能最好的方向。
**学习模式不同。**PCA属于无监督式学习,因此大多场景下只作为数据处理过程的一部分,需要与其他算法结合使用,例如将PCA与聚类、判别分析、回归分析等组合使用;LDA是一种监督式学习方法,本身除了可以降维外,还可以进行预测应用,因此既可以组合其他模型一起使用,也可以独立使用。
**降维后可用维度数量不同。**LDA降维后最多可生成C-1维子空间(分类标签数-1),因此LDA与原始维度N数量无关,只有数据标签分类数量有关;而PCA最多有n维度可用,即最大可以选择全部可用维度。
线性判别分析LDA算法由于其简单有效性在多个领域都得到了广泛地应用,是目前机器学习、数据挖掘领域经典且热门的一个算法;但是算法本身仍然存在一些局限性:
当样本数量远小于样本的特征维数,样本与样本之间的距离变大使得距离度量失效,使LDA算法中的类内、类间离散度矩阵奇异,不能得到最优的投影方向,在人脸识别领域中表现得尤为突出
LDA不适合对非高斯分布的样本进行降维
LDA在样本分类信息依赖方差而不是均值时,效果不好
LDA可能过度拟合数据
主成分分析 PCA 详解 原理及对应操作 主成分分析顾名思义是对主成分进行分析,那么找出主成分应该是key点。PCA的基本思想就是将初始数据集中的n维特征映射至k维上,得到的k维特征就可以被称作主成分,k维不是在n维中挑选出来的,而是以n维特征为基础重构出来的。</description>
</item>
<item>
<title>最常考的树模型问题</title>
<link>https://reid00.github.io/posts/ml/%E6%9C%80%E5%B8%B8%E8%80%83%E7%9A%84%E6%A0%91%E6%A8%A1%E5%9E%8B%E9%97%AE%E9%A2%98/</link>
<pubDate>Thu, 16 Mar 2023 19:35:21 +0800</pubDate>
<guid>https://reid00.github.io/posts/ml/%E6%9C%80%E5%B8%B8%E8%80%83%E7%9A%84%E6%A0%91%E6%A8%A1%E5%9E%8B%E9%97%AE%E9%A2%98/</guid>
<description>问题目录: 1、决策树的实现、ID3、C4.5、CART(贝壳) 2、CART回归树是怎么实现的?(贝壳) 3、CART分类树和ID3以及C4.5有什么区别(贝壳) 4、剪枝有哪几种方式(贝壳) 5、树集成模型有哪几种实现方式?(贝壳)boosting和bagging的区别是什么?(知乎、阿里) 6、随机森林的随机体现在哪些方面(贝壳、阿里) 7、AdaBoost是如何改变样本权重,GBDT分类树的基模型是?(贝壳) 8、gbdt,xgboost,lgbm的区别(百度、滴滴、阿里,头条) 9、bagging为什么能减小方差?(知乎)
其他问题: 10、关于AUC的另一种解释:是挑选一个正样本和一个负样本,正样本排在负样本前面的概率?如何理解? 11、校招是集中时间刷题好,还是每天刷一点好呢? 12、现在推荐在工业界基本都用match+ranking的架构,但是学术界论文中的大多算法算是没有区分吗?end-to-end的方式,还是算是召回? 13、内推刷简历严重么?没有实习经历,也没有牛逼的竞赛和论文,提前批有面试机会么?提前批影响正式批么? 14、除了自己项目中的模型了解清楚,还需要准备哪些?看了群主的面经大概知道了一些,能否大致描述下?
1、决策树的实现、ID3、C4.5、CART(贝壳) 这道题主要是要求把公式写一下,所以决策树的公式大家要理解,并且能熟练地写出来。这里咱们简单回顾一下吧。主要参考统计学习方法就好了。
ID3使用信息增益来指导树的分裂: C4.5通过信息增益比来指导树的分裂: CART的话既可以是分类树,也可以是回归树。当是分类树时,使用基尼系数来指导树的分裂: 当是回归树时,则使用的是平方损失最小: 2、CART回归树是怎么实现的?(贝壳) CART回归树的实现包含两个步骤: 1)决策树生成:基于训练数据生成决策树、生成的决策树要尽量大 2)决策树剪枝:用验证数据集对已生成的树进行剪枝并选择最优子树,这时用损失函数最小作为剪枝的标准。
这部分的知识,可以看一下《统计学习方法》一书。
3、CART分类树和ID3以及C4.5有什么区别(贝壳) 1)首先是决策规则的区别,CART分类树使用基尼系数、ID3使用的是信息增益,而C4.5使用的是信息增益比。 2)ID3和C4.5可以是多叉树,但是CART分类树只能是二叉树(这是我当时主要回答的点)
4、剪枝有哪几种方式(贝壳) 前剪枝和后剪枝,参考周志华《机器学习》。
5、树集成模型有哪几种实现方式?(贝壳)boosting和bagging的区别是什么?(知乎、阿里) 树集成模型主要有两种实现方式,分别是Bagging和Boosting。二者的区别主要有以下四点: 1)样本选择上: Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的. Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化.而权值是根据上一轮的分类结果进行调整. 2)样例权重: Bagging:使用均匀取样,每个样例的权重相等 Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大. 3)预测函数: Bagging:所有预测函数的权重相等. Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重. 4)并行计算: Bagging:各个预测函数可以并行生成 Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果.
6、随机森林的随机体现在哪些方面(贝壳、阿里) 随机森林的随机主要体现在两个方面:一个是建立每棵树时所选择的特征是随机选择的;二是生成每棵树的样本也是通过有放回抽样产生的。
7、AdaBoost是如何改变样本权重,GBDT分类树的基模型是?(贝壳) AdaBoost改变样本权重:增加分类错误的样本的权重,减小分类正确的样本的权重。
最后一个问题是我在面试之前没有了解到的,GBDT无论做分类还是回归问题,使用的都是CART回归树。
8、gbdt,xgboost,lgbm的区别(百度、滴滴、阿里,头条) 首先来看GBDT和Xgboost,二者的区别如下:
1)传统 GBDT 以 CART 作为基分类器,xgboost 还支持线性分类器,这个时候 xgboost 相当于带 L1 和 L2 正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。 2)传统 GBDT 在优化时只用到一阶导数信息,xgboost 则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便 一下,xgboost 工具支持自定义代价函数,只要函数可一阶和二阶求导。 3)xgboost 在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的 score 的 L2 模的平方和。从 Bias-variance tradeoff 角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是 xgboost 优于传统GBDT 的一个特性。 4)Shrinkage(缩减),相当于学习速率(xgboost 中的eta)。xgboost 在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削 弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把 eta 设置得小一点,然后迭代次数设置得大一点。(补充:传统 GBDT 的实现 也有学习速率) 5)列抽样(column subsampling)。xgboost 借鉴了随机森林的做法,支 持列抽样,不仅能降低过拟合,还能减少计算,这也是 xgboost 异于传 统 gbdt 的一个特性。 6)对缺失值的处理。对于特征的值有缺失的样本,xgboost 可以自动学习 出它的分裂方向。 7)xgboost 工具支持并行。boosting 不是一种串行的结构吗?</description>
</item>
<item>
<title>决策树到随机森林</title>
<link>https://reid00.github.io/posts/ml/%E5%86%B3%E7%AD%96%E6%A0%91%E5%88%B0%E9%9A%8F%E6%9C%BA%E6%A3%AE%E6%9E%97/</link>
<pubDate>Thu, 16 Mar 2023 19:35:20 +0800</pubDate>
<guid>https://reid00.github.io/posts/ml/%E5%86%B3%E7%AD%96%E6%A0%91%E5%88%B0%E9%9A%8F%E6%9C%BA%E6%A3%AE%E6%9E%97/</guid>
<description>简述决策树原理? 决策树是一种自上而下,对样本数据进行树形分类的过程,由节点和有向边组成。节点分为内部节点和叶节点,其中每个内部节点表示一个特征或属性,叶节点表示类别。从顶部节点开始,所有样本聚在一起,经过根节点的划分,样本被分到不同的子节点中,再根据子节点的特征进一步划分,直至所有样本都被归到某个类别。
为什么要对决策树进行减枝?如何进行减枝? 剪枝是决策树解决过拟合问题的方法。在决策树学习过程中,为了尽可能正确分类训练样本,结点划分过程将不断重复,有时会造成决策树分支过多,于是可能将训练样本学得太好,以至于把训练集自身的一些特点当作所有数据共有的一般特点而导致测试集预测效果不好,出现了过拟合现象。因此,可以通过剪枝来去掉一些分支来降低过拟合的风险。
决策树剪枝的基本策略有“预剪枝”和“后剪枝”。预剪枝是指在决策树生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点;后剪枝则是先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点。
预剪枝使得决策树的很多分支都没有&quot;展开”,这不仅降低了过拟合的风险,还显著减少了决策树的训练时间开销和测试时间开销。但另一方面,有些分支的当前划分虽不能提升泛化性能、甚至可能导致泛化性能暂时下降?但在其基础上进行的后续划分却有可能导致性能显著提高;预剪枝基于&quot;贪心&quot;本质禁止这些分支展开,给预剪枝决策树带来了欠拟含的风险。
后剪枝决策树通常比预剪枝决策树保留了更多的分支,一般情形下后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树 。但后剪枝过程是在生成完全决策树之后进行的 并且要白底向上对树中的所有非叶结点进行逐 考察,因此其训练时间开销比未剪枝决策树和预剪枝决策树都要大得多。
简述决策树的生成策略? 决策树主要有ID3、C4.5、CART,算法的适用略有不同,但它们有个总原则,即在选择特征、向下分裂、树生成中,它们都是为了让信息更“纯”。
举一个简单例子,通过三个特征:是否有喉结、身高、体重,判断人群中的男女,是否有喉结把人群分为两部分,一边全是男性、一边全是女性,达到理想结果,纯度最高。 通过身高或体重,人群会有男有女。 上述三种算法,信息增益、增益率、基尼系数对“纯”的不同解读。如下详细阐述:
综上,ID3采用信息增益作为划分依据,会倾向于取值较多的特征,因为信息增益反映的是给定条件以后不确定性减少的程度,特征取值越多就意味着不确定性更高。C4.5对ID3进行优化,通过引入信息增益率,对特征取值较多的属性进行惩罚。
随机森林 Bagging(套袋法) bagging的算法过程如下:
从原始样本集中使用Bootstraping方法随机抽取n个训练样本,共进行k轮抽取,得到k个训练集。(k个训练集之间相互独立,元素可以有重复) 对于k个训练集,我们训练k个模型(这k个模型可以根据具体问题而定,比如决策树,knn等) 对于分类问题:由投票表决产生分类结果;对于回归问题:由k个模型预测结果的均值作为最后预测结果。(所有模型的重要性相同) Boosting(提升法) boosting的算法过程如下:
对于训练集中的每个样本建立权值wi,表示对每个样本的关注度。当某个样本被误分类的概率很高时,需要加大对该样本的权值。 进行迭代的过程中,每一步迭代都是一个弱分类器。我们需要用某种策略将其组合,作为最终模型。(例如AdaBoost给每个弱分类器一个权值,将其线性组合最为最终分类器。误差越小的弱分类器,权值越大) 提升就是指每一步我都产生一个弱预测模型,然后加权累加到总模型中,然后每一步弱预测模型生成的的依据都是损失函数的负梯度方向,这样若干步以后就可以达到逼近损失函数局部最小值的目标。 Bagging,Boosting的主要区别 样本选择上:Bagging采用的是Bootstrap随机有放回抽样;而Boosting每一轮的训练集是不变的,改变的只是每一个样本的权重。
每轮训练过后如何调整样本权重 ?
如何确定最后各学习器的权重 这两个问题可由加法模型和指数损失函数推导出来。
样本权重:Bagging使用的是均匀取样,每个样本权重相等;Boosting根据错误率调整样本权重,错误率越大的样本权重越大。
预测函数:Bagging所有的预测函数的权重相等;Boosting中误差越小的预测函数其权重越大。
并行计算:Bagging各个预测函数可以并行生成;Boosting各个预测函数必须按顺序迭代生成。
下面是将决策树与这些算法框架进行结合所得到的新的算法: 1)Bagging + 决策树 = 随机森林 2)AdaBoost + 决策树 = 提升树 (自适应提升(AdaBoost)) 3)Gradient Boosting + 决策树 = GBDT 梯度下降提升树(GDBT)
首先既然是树,那么它的基函数肯定就是决策树啦,而损失函数则是根据我们具体的问题去分析,但方法都一样,最终都走上了梯度下降的老路,比如说进行到第m步的时候,首先计算残差
有了残差之后,我们再用(xi,rim)去拟合第m个基函数,假设这棵树把输入空间划分成j个空间R1m,R2m……,Rjm,假设它在每个空间上的输出为bjm,这样的话,第m棵树可以表示如下:
下一步,对树的每个区域分别用线性搜索的方式寻找最佳步长,这个步长可以和上面的区域预测值bjm进行合并,最后就得到了第m步的目标函数
当然了,对于GDBT比较容易出现过拟合的情况,所以有必要增加一点正则项,比如叶节点的数目或叶节点预测值的平方和,进而限制模型复杂度的过度提升,这里在下面的实践中的参数设置我们可以继续讨论。
构造随机森林的 4 个步骤: 假如有N个样本,则有放回的随机选择N个样本(每次随机选择一个样本,然后返回继续选择)。这选择好了的N个样本用来训练一个决策树,作为决策树根节点处的样本。
当每个样本有M个属性时,在决策树的每个节点需要分裂时,随机从这M个属性中选取出m个属性,满足条件m &laquo; M。然后从这m个属性中采用某种策略(比如说信息增益)来选择1个属性作为该节点的分裂属性。
策树形成过程中每个节点都要按照步骤2来分裂(很容易理解,如果下一次该节点选出来的那一个属性是刚刚其父节点分裂时用过的属性,则该节点已经达到了叶子节点,无须继续分裂了)。一直到不能够再分裂为止。注意整个决策树形成过程中没有进行剪枝。
按照步骤1~3建立大量的决策树,这样就构成了随机森林了。
随机森林的优缺点 优点 它可以出来很高维度(特征很多)的数据,并且不用降维,无需做特征选择 它可以判断特征的重要程度 可以判断出不同特征之间的相互影响 不容易过拟合 训练速度比较快,容易做成并行方法 实现起来比较简单 对于不平衡的数据集来说,它可以平衡误差。 如果有很大一部分的特征遗失,仍可以维持准确度。 缺点 随机森林已经被证明在某些噪音较大的分类或回归问题上会过拟合。 对于有不同取值的属性的数据,取值划分较多的属性会对随机森林产生更大的影响,所以随机森林在这种数据上产出的属性权值是不可信的 </description>
</item>
<item>
<title>如何评价模型好坏</title>
<link>https://reid00.github.io/posts/ml/%E5%A6%82%E4%BD%95%E8%AF%84%E4%BB%B7%E6%A8%A1%E5%9E%8B%E5%A5%BD%E5%9D%8F/</link>
<pubDate>Thu, 16 Mar 2023 19:35:20 +0800</pubDate>
<guid>https://reid00.github.io/posts/ml/%E5%A6%82%E4%BD%95%E8%AF%84%E4%BB%B7%E6%A8%A1%E5%9E%8B%E5%A5%BD%E5%9D%8F/</guid>
<description>Summary “所有模型都是坏的,但有些模型是有用的”。我们建立模型之后,接下来就要去评估模型,确定这个模型是否‘有用’。当你费尽全力去建立完模型后,你会发现仅仅就是一些单个的数值或单个的曲线去告诉你你的模型到底是否能够派上用场。
在实际情况中,我们会用不同的度量去评估我们的模型,而度量的选择,完全取决于模型的类型和模型以后要做的事。下面我们就会学习到一些用于评价模型的常用度量和图表以及它们各自的使用场景。
模型评估这部分会介绍以下几方面的内容:
性能度量 模型评估方法 泛化能力 过拟合、欠拟合 超参数调优 本文会首先介绍性能度量方面的内容,主要是分类问题和回归问题的性能指标,包括以下几个方法的介绍:
准确率和错误率 精确率、召回率以及 F1 ROC 曲线 和 AUC 代价矩阵 回归问题的性能度量 其他评价指标,如计算速度、鲁棒性等 1. 性能度量 性能度量就是指对模型泛化能力衡量的评价标准。
1.1 准确率和错误率 分类问题中最常用的两个性能度量标准&ndash; 准确率和错误率。
准确率: 指的是分类正确的样本数量占样本总数的比例,定义如下:
错误率:指分类错误的样本占样本总数的比例,定义如下:
错误率也是损失函数为 0-1 损失时的误差。
这两种评价标准是分类问题中最简单也是最直观的评价指标。但它们都存在一个问题,在类别不平衡的情况下,它们都无法有效评价模型的泛化能力。即如果此时有 99% 的负样本,那么模型预测所有样本都是负样本的时候,可以得到 99% 的准确率。
这种情况就是在类别不平衡的时候,占比大的类别往往成为影响准确率的最主要因素!
这种时候,其中一种解决方法就是更换评价指标,比如采用更为有效的平均准确率(每个类别的样本准确率的算术平均),即:
其中 m 是类别的数量。
对于准确率和错误率,用 Python 代码实现如下图所示:
1 2 3 4 5 6 def accuracy(y_true,y_pred): return sum(y==y_p for y,y_p in zip(y_true,y_pred))/len(y_true def error(y_true, y_pred): return sum(y != y_p for y, y_p in zip(y_true, y_pred)) / len(y_true) 一个简单的二分类测试样例:</description>
</item>
<item>
<title>常用Normalization方法的总结与思考</title>
<link>https://reid00.github.io/posts/ml/%E5%B8%B8%E7%94%A8normalization%E6%96%B9%E6%B3%95%E7%9A%84%E6%80%BB%E7%BB%93%E4%B8%8E%E6%80%9D%E8%80%83/</link>
<pubDate>Thu, 16 Mar 2023 19:35:20 +0800</pubDate>
<guid>https://reid00.github.io/posts/ml/%E5%B8%B8%E7%94%A8normalization%E6%96%B9%E6%B3%95%E7%9A%84%E6%80%BB%E7%BB%93%E4%B8%8E%E6%80%9D%E8%80%83/</guid>
<description>简介 常用的Normalization方法主要有:Batch Normalization(BN,2015年)、Layer Normalization(LN,2016年)、Instance Normalization(IN,2017年)、Group Normalization(GN,2018年)。它们都是从激活函数的输入来考虑、做文章的,以不同的方式对激活函数的输入进行 Norm 的。
我们将输入的 feature map shape 记为**[N, C, H, W]**,其中N表示batch size,即N个样本;C表示通道数;H、W分别表示特征图的高度、宽度。这几个方法主要的区别就是在:
BN是在batch上,对N、H、W做归一化,而保留通道 C 的维度。BN对较小的batch size效果不好。BN适用于固定深度的前向神经网络,如CNN,不适用于RNN;
LN在通道方向上,对C、H、W归一化,主要对RNN效果明显;
IN在图像像素上,对H、W做归一化,用在风格化迁移;
GN将channel分组,然后再做归一化。
每个子图表示一个特征图,其中N为批量,C为通道,(H,W)为特征图的高度和宽度。通过蓝色部分的值来计算均值和方差,从而进行归一化。
如果把特征图比喻成一摞书,这摞书总共有 N 本,每本有 C 页,每页有 H 行,每行 有W 个字符。
BN 求均值时,相当于把这些书按页码一一对应地加起来(例如第1本书第36页,第2本书第36页&hellip;&hellip;),再除以每个页码下的字符总数:N×H×W,因此可以把 BN 看成求“平均书”的操作(注意这个“平均书”每页只有一个字),求标准差时也是同理。
LN 求均值时,相当于把每一本书的所有字加起来,再除以这本书的字符总数:C×H×W,即求整本书的“平均字”,求标准差时也是同理。
IN 求均值时,相当于把一页书中所有字加起来,再除以该页的总字数:H×W,即求每页书的“平均字”,求标准差时也是同理。
GN 相当于把一本 C 页的书平均分成 G 份,每份成为有 C/G 页的小册子,求每个小册子的“平均字”和字的“标准差”。
参考:
https://mp.weixin.qq.com/s/dDMPBYjPeilivSA8J8W7lA https://zhuanlan.zhihu.com/p/72589565 </description>
</item>
<item>
<title>SVM</title>
<link>https://reid00.github.io/posts/ml/svm/</link>
<pubDate>Thu, 16 Mar 2023 19:35:19 +0800</pubDate>
<guid>https://reid00.github.io/posts/ml/svm/</guid>
<description>1. SVM SVM的应用 SVM在很多诸如文本分类,图像分类,生物序列分析和生物数据挖掘,手写字符识别等领域有很多的应用,但或许你并没强烈的意识到,SVM可以成功应用的领域远远超出现在已经在开发应用了的领域。
通常人们会从一些常用的核函数中选择(根据问题和数据的不同,选择不同的参数,实际上就是得到了不同的核函数),例如:多项式核、高斯核、线性核。
SVM是一种二类分类模型。它的基本模型是在特征空间中寻找间隔最大化的分离超平面的线性分类器。(间隔最大是它有别于感知机)
(1)当训练样本线性可分时,通过硬间隔最大化,学习一个线性分类器,即线性可分支持向量机;
(2)当训练数据近似线性可分时,引入松弛变量,通过软间隔最大化,学习一个线性分类器,即线性支持向量机;
(3)当训练数据线性不可分时,通过使用核技巧及软间隔最大化,学习非线性支持向量机。
注:以上各SVM的数学推导应该熟悉:硬间隔最大化(几何间隔)&mdash;学习的对偶问题&mdash;软间隔最大化(引入松弛变量)&mdash;非线性支持向量机(核技巧)。
读者可能还是没明白核函数到底是个什么东西?我再简要概括下,即以下三点:
实际中,我们会经常遇到线性不可分的样例,此时,我们的常用做法是把样例特征映射到高维空间中去(映射到高维空间后,相关特征便被分开了,也就达到了分类的目的); 但进一步,如果凡是遇到线性不可分的样例,一律映射到高维空间,那么这个维度大小是会高到可怕的。那咋办呢? 此时,核函数就隆重登场了,核函数的价值在于它虽然也是将特征进行从低维到高维的转换,但核函数绝就绝在它事先在低维上进行计算,而将实质上的分类效果表现在了高维上,避免了直接在高维空间中的复杂计算 2. SVM的一些问题 SVM为什么采用间隔最大化? 当训练数据线性可分时,存在无穷个分离超平面可以将两类数据正确分开。
感知机利用误分类最小策略,求得分离超平面,不过此时的解有无穷多个。
线性可分支持向量机利用间隔最大化求得最优分离超平面,这时,解是唯一的。另一方面,此时的分隔超平面所产生的分类结果是最鲁棒的,对未知实例的泛化能力最强。
然后应该借此阐述,几何间隔,函数间隔,及从函数间隔—&gt;求解最小化1/2 ||w||^2 时的w和b。即线性可分支持向量机学习算法—最大间隔法的由来。
SVM如何处理多分类问题?** 一般有两种做法:一种是直接法,直接在目标函数上修改,将多个分类面的参数求解合并到一个最优化问题里面。看似简单但是计算量却非常的大。
另外一种做法是间接法:对训练器进行组合。其中比较典型的有一对一,和一对多。
一对多,就是对每个类都训练出一个分类器,由svm是二分类,所以将此而分类器的两类设定为目标类为一类,其余类为另外一类。这样针对k个类可以训练出k个分类器,当有一个新的样本来的时候,用这k个分类器来测试,那个分类器的概率高,那么这个样本就属于哪一类。这种方法效果不太好,bias比较高。
svm一对一法(one-vs-one),针对任意两个类训练出一个分类器,如果有k类,一共训练出C(2,k) 个分类器,这样当有一个新的样本要来的时候,用这C(2,k) 个分类器来测试,每当被判定属于某一类的时候,该类就加一,最后票数最多的类别被认定为该样本的类。
是否存在一组参数使SVM训练误差为0? Y
训练误差为0的SVM分类器一定存在吗? 一定存在
加入松弛变量的SVM的训练误差可以为0吗? 如果数据中出现了离群点outliers,那么就可以使用松弛变量来解决。
使用SMO算法训练的线性分类器并不一定能得到训练误差为0的模型。这是由 于我们的优化目标改变了,并不再是使训练误差最小。
带核的SVM为什么能分类非线性问题? 核函数的本质是两个函数的內积,通过核函数将其隐射到高维空间,在高维空间非线性问题转化为线性问题, SVM得到超平面是高维空间的线性分类平面。其分类结果也视为低维空间的非线性分类结果, 因而带核的SVM就能分类非线性问题。
如何选择核函数? 如果特征的数量大到和样本数量差不多,则选用LR或者线性核的SVM; 如果特征的数量小,样本的数量正常,则选用SVM+高斯核函数; 如果特征的数量小,而样本的数量很大,则需要手工添加一些特征从而变成第一种情况。 3. LR和SVM的联系与区别 相同点 都是线性分类器。本质上都是求一个最佳分类超平面。
都是监督学习算法
都是判别模型。判别模型不关心数据是怎么生成的,它只关心信号之间的差别,然后用差别来简单对给定的一个信号进行分类。常见的判别模型有:KNN、SVM、LR,常见的生成模型有:朴素贝叶斯,隐马尔可夫模型。
不同点 LR是参数模型,svm是非参数模型,linear和rbf则是针对数据线性可分和不可分的区别
从目标函数来看,区别在于逻辑回归采用的是logistical loss,SVM采用的是hinge loss,这两个损失函数的目的都是增加对分类影响较大的数据点的权重,减少与分类关系较小的数据点的权重。
SVM的处理方法是只考虑support vectors,也就是和分类最相关的少数点,去学习分类器。而逻辑回归通过非线性映射,大大减小了离分类平面较远的点的权重,相对提升了与分类最相关的数据点的权重。
逻辑回归相对来说模型更简单,好理解,特别是大规模线性分类时比较方便。而SVM的理解和优化相对来说复杂一些,SVM转化为对偶问题后,分类只需要计算与少数几个支持向量的距离,这个在进行复杂核函数计算时优势很明显,能够大大简化模型和计算。
logic 能做的 svm能做,但可能在准确率上有问题,svm能做的logic有的做不了。
4. 线性分类器与非线性分类器的区别以及优劣 线性和非线性是针对模型参数和输入特征来讲的;比如输入x,模型y=ax+ax^2 那么就是非线性模型,如果输入是x和X^2则模型是线性的。
线性分类器可解释性好,计算复杂度较低,不足之处是模型的拟合效果相对弱些。
LR,贝叶斯分类,单层感知机、线性回归
非线性分类器效果拟合能力较强,不足之处是数据量不足容易过拟合、计算复杂度高、可解释性不好。</description>
</item>
<item>
<title>Word2vec</title>
<link>https://reid00.github.io/posts/ml/word2vec/</link>
<pubDate>Thu, 16 Mar 2023 19:35:19 +0800</pubDate>
<guid>https://reid00.github.io/posts/ml/word2vec/</guid>
<description>Word2vec 介绍 Word2Vec是google在2013年推出的一个NLP工具,它的特点是能够将单词转化为向量来表示。首先,word2vec可以在百万数量级的词典和上亿的数据集上进行高效地训练;其次,该工具得到的训练结果——词向量(word embedding),可以很好地度量词与词之间的相似性。随着深度学习(Deep Learning)在自然语言处理中应用的普及,很多人误以为word2vec是一种深度学习算法。其实word2vec算法的背后是一个浅层神经网络(有一个隐含层的神经元网络)。另外需要强调的一点是,word2vec是一个计算word vector的开源工具。当我们在说word2vec算法或模型的时候,其实指的是其背后用于计算word vector的CBOW模型和Skip-gram模型。很多人以为word2vec指的是一个算法或模型,这也是一种谬误。
用词向量来表示词并不是Word2Vec的首创,在很久之前就出现了。最早的词向量采用One-Hot编码,又称为一位有效编码,每个词向量维度大小为整个词汇表的大小,对于每个具体的词汇表中的词,将对应的位置置为1。转化为N维向量。
采用One-Hot编码方式来表示词向量非常简单,但缺点也是显而易见的,一方面我们实际使用的词汇表很大,经常是百万级以上,这么高维的数据处理起来会消耗大量的计算资源与时间。另一方面,One-Hot编码中所有词向量之间彼此正交,没有体现词与词之间的相似关系。
Word2vec 是 Word Embedding 方式之一,属于 NLP 领域。他是将词转化为「可计算」「结构化」的向量的过程。本文将讲解 Word2vec 的原理和优缺点。
什么是 Word2vec ? 什么是 Word Embedding ? 在说明 Word2vec 之前,需要先解释一下 Word Embedding。 它就是将「不可计算」「非结构化」的词转化为「可计算」「结构化」的向量。
这一步解决的是”将现实问题转化为数学问题“,是人工智能非常关键的一步。 将现实问题转化为数学问题只是第一步,后面还需要求解这个数学问题。所以 Word Embedding 的模型本身并不重要,重要的是生成出来的结果——词向量。因为在后续的任务中会直接用到这个词向量。
什么是 Word2vec ? Word2vec 是 Word Embedding 的方法之一。他是 2013 年由谷歌的 Mikolov 提出了一套新的词嵌入方法。
Word2vec 在整个 NLP 里的位置可以用下图表示: Word2vec 的 2 种训练模式 CBOW(Continuous Bag-of-Words Model)和Skip-gram (Continuous Skip-gram Model),是Word2vec 的两种训练模式。CBOW适合于数据集较小的情况,而Skip-Gram在大型语料中表现更好。下面简单做一下解释:
词向量训练的预处理步骤:
1. 对输入的文本生成一个词汇表,每个词统计词频,按照词频从高到低排序,取最频繁的V个词,构成一个词汇表。每个词存在一个one-hot向量,向量的维度是V,如果该词在词汇表中出现过,则向量中词汇表中对应的位置为1,其他位置全为0。如果词汇表中不出现,则向量为全02. 将输入文本的每个词都生成一个one-hot向量,此处注意保留每个词的原始位置,因为是上下文相关的3. 确定词向量的维数NCBOW 通过上下文来预测当前值。相当于一句话中扣掉一个词,让你猜这个词是什么。 CBOW的处理步骤:</description>
</item>
<item>
<title>决策树</title>
<link>https://reid00.github.io/posts/ml/%E5%86%B3%E7%AD%96%E6%A0%91/</link>
<pubDate>Thu, 16 Mar 2023 19:35:19 +0800</pubDate>
<guid>https://reid00.github.io/posts/ml/%E5%86%B3%E7%AD%96%E6%A0%91/</guid>
<description>决策树 决策树(decision tree)是一个树结构(可以是二叉树或非二叉树)。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果[1]。 下面先来看一个小例子,看看决策树到底是什么概念(这个例子来源于[2])。
决策树的训练数据往往就是这样的表格形式,表中的前三列(ID不算)是数据样本的属性,最后一列是决策树需要做的分类结果。通过该数据,构建的决策树如下:
有了这棵树,我们就可以对新来的用户数据进行是否可以偿还的预测了。
决策树最重要的是决策树的构造。所谓决策树的构造就是进行属性选择度量确定各个特征属性之间的拓扑结构。构造决策树的关键步骤是分裂属性。所谓分裂属性就是在某个节点处按照某一特征属性的不同划分构造不同的分支,其目标是让各个分裂子集尽可能地“纯”。尽可能“纯”就是尽量让一个分裂子集中待分类项属于同一类别。分裂属性分为三种不同的情况[1]: 1、属性是离散值且不要求生成二叉决策树。此时用属性的每一个划分作为一个分支。 2、属性是离散值且要求生成二叉决策树。此时使用属性划分的一个子集进行测试,按照“属于此子集”和“不属于此子集”分成两个分支。 3、属性是连续值。此时确定一个值作为分裂点split_point,按照&gt;split_point和&lt;=split_point生成两个分支。
决策树的属性分裂选择是”贪心“算法,也就是没有回溯的。
ID3.5 好了,接下来说一下教科书上提到最多的决策树ID3.5算法(是最基本的模型,简单实用,但是在某些场合下也有缺陷)。
信息论中有熵(entropy)的概念,表示状态的混乱程度,熵越大越混乱。熵的变化可以看做是信息增益,决策树ID3算法的核心思想是以信息增益度量属性选择,选择分裂后信息增益最大的属性进行分裂。
设D为用(输出)类别对训练元组进行的划分,则D的熵表示为: info(D)=−∑i=1mpilog2(pi)info(D)=−∑i=1mpilog2(pi)
其中pipi表示第i个类别在整个训练元组中出现的概率,一般来说会用这个类别的样本数量占总量的占比来作为概率的估计;熵的实际意义表示是D中元组的类标号所需要的平均信息量。熵的含义可以看我前面写的PRML ch1.6 信息论的介绍。 如果将训练元组D按属性A进行划分,则A对D划分的期望信息为: infoA(D)=∑j=1v|Dj||D|info(Dj) infoA(D)=∑j=1v|Dj||D|info(Dj) 于是,信息增益就是两者的差值: gain(A)=info(D)−infoA(D) gain(A)=info(D)−infoA(D) ID3决策树算法就用到上面的信息增益,在每次分裂的时候贪心选择信息增益最大的属性,作为本次分裂属性。每次分裂就会使得树长高一层。这样逐步生产下去,就一定可以构建一颗决策树。(基本原理就是这样,但是实际中,为了防止过拟合,以及可能遇到叶子节点类别不纯的情况,需要有一些特殊的trick,这些留到最后讲)
OK,借鉴一下[1]中的一个小例子,来看一下信息增益的计算过程。
这个例子是这样的:输入样本的属性有三个——日志密度(L),好友密度(F),以及是否使用真实头像(H);样本的标记是账号是否真实yes or no。
然后可以一次计算每一个属性的信息增益,比如日致密度的信息增益是0.276。
同理可得H和F的信息增益为0.033和0.553。因为F具有最大的信息增益,所以第一次分裂选择F为分裂属性,分裂后的结果如下图表示:
上面为了简便,将特征属性离散化了,其实日志密度和好友密度都是连续的属性。对于特征属性为连续值,可以如此使用ID3算法:先将D中元素按照特征属性排序,则每两个相邻元素的中间点可以看做潜在分裂点,从第一个潜在分裂点开始,分裂D并计算两个集合的期望信息,具有最小期望信息的点称为这个属性的最佳分裂点,其信息期望作为此属性的信息期望。
C4.5 ID3有一些缺陷,就是选择的时候容易选择一些比较容易分纯净的属性,尤其在具有像ID值这样的属性,因为每个ID都对应一个类别,所以分的很纯净,ID3比较倾向找到这样的属性做分裂。
C4.5算法定义了分裂信息,表示为: split_infoA(D)=−∑j=1v|Dj||D|log2(|Dj||D|) split_infoA(D)=−∑j=1v|Dj||D|log2(|Dj||D|) 很容易理解,这个也是一个熵的定义,pi=|Dj||D|pi=|Dj||D|,可以看做是属性分裂的熵,分的越多就越混乱,熵越大。定义信息增益率: gain_ratio(A)=gain(A)split_info(A) gain_ratio(A)=gain(A)split_info(A)
C4.5就是选择最大增益率的属性来分裂,其他类似ID3.5。
CART CART(Classification And Regression Tree)算法既可以用于创建分类树,也可以用于创建回归树。CART算法的重要特点包含以下三个方面:
二分(Binary Split):在每次判断过程中,都是对样本数据进行二分。CART算法是一种二分递归分割技术,把当前样本划分为两个子样本,使得生成的每个非叶子结点都有两个分支,因此CART算法生成的决策树是结构简洁的二叉树。由于CART算法构成的是一个二叉树,它在每一步的决策时只能是“是”或者“否”,即使一个feature有多个取值,也是把数据分为两部分 单变量分割(Split Based on One Variable):每次最优划分都是针对单个变量。 剪枝策略:CART算法的关键点,也是整个Tree-Based算法的关键步骤。剪枝过程特别重要,所以在最优决策树生成过程中占有重要地位。有研究表明,剪枝过程的重要性要比树生成过程更为重要,对于不同的划分标准生成的最大树(Maximum Tree),在剪枝之后都能够保留最重要的属性划分,差别不大。反而是剪枝方法对于最优树的生成更为关键。 CART分类决策树 GINI指数 CART的分支标准建立在GINI指数这个概念上,GINI指数主要是度量数据划分的不纯度,是介于0~1之间的数。GINI值越小,表明样本集合的纯净度越高;GINI值越大表明样本集合的类别越杂乱
CART分类时,使用基尼指数(Gini)来选择最好的数据分割的特征,gini描述的是纯度,与信息熵的含义相似。CART中每一次迭代都会降低GINI系数。最好的划分就是使得GINI_Gain最小的划分。
停止条件 决策树的构建过程是一个递归的过程,所以需要确定停止条件,否则过程将不会结束。一种最直观的方式是当每个子节点只有一种类型的记录时停止,但是这样往往会使得树的节点过多,导致过拟合问题(Overfitting)。另一种可行的方法是当前节点中的记录数低于一个最小的阀值,那么就停止分割,将max(P(i))对应的分类作为当前叶节点的分类。
过度拟合 采用上面算法生成的决策树在事件中往往会导致过度拟合。也就是该决策树对训练数据可以得到很低的错误率,但是运用到测试数据上却得到非常高的错误率。过渡拟合的原因有以下几点: •噪音数据:训练数据中存在噪音数据,决策树的某些节点有噪音数据作为分割标准,导致决策树无法代表真实数据。 •缺少代表性数据:训练数据没有包含所有具有代表性的数据,导致某一类数据无法很好的匹配,这一点可以通过观察混淆矩阵(Confusion Matrix)分析得出。 •多重比较(Mulitple Comparision):举个列子,股票分析师预测股票涨或跌。假设分析师都是靠随机猜测,也就是他们正确的概率是0.5。每一个人预测10次,那么预测正确的次数在8次或8次以上的概率为 ,C810∗(0.5)10+C910∗(0.5)10+C1010∗(0.5)10C108∗(0.5)10+C109∗(0.5)10+C1010∗(0.5)10只有5%左右,比较低。但是如果50个分析师,每个人预测10次,选择至少一个人得到8次或以上的人作为代表,那么概率为 1−(1−0.</description>
</item>
<item>
<title>KNN算法</title>
<link>https://reid00.github.io/posts/ml/knn%E7%AE%97%E6%B3%95/</link>
<pubDate>Thu, 16 Mar 2023 19:35:18 +0800</pubDate>
<guid>https://reid00.github.io/posts/ml/knn%E7%AE%97%E6%B3%95/</guid>
<description>Summary 简单的说,k-近邻算法采用测量不同特征值之间的距离方法进行分类。 它的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别,其中K通常是不大于20的整数。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。
优点:精度高、对异常值不敏感、无数据输入假定。
缺点:计算复杂度高、空间复杂度高。
适用数据范围:数值型和标称型。
详细介绍 下面通过一个简单的例子说明一下:如下图,绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果K=3,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类,如果K=5,由于蓝色四方形比例为3/5,因此绿色圆被赋予蓝色四方形类。
由此也说明了KNN算法的结果很大程度取决于K的选择。
在KNN中,通过计算对象间距离来作为各个对象之间的非相似性指标,避免了对象之间的匹配问题,在这里距离一般使用欧氏距离或曼哈顿距离:
**接下来对KNN算法的思想总结一下:**就是在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K个数据,则该测试数据对应的类别就是K个数据中出现次数最多的那个分类,其算法的描述为:
1)计算测试数据与各个训练数据之间的距离;
2)按照距离的递增关系进行排序;
3)选取距离最小的K个点;
4)确定前K个点所在类别的出现频率;
5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。
常见问题 1. K值设定为多大? K太小,分类结果易受噪声点影响;k太大,近邻中又可能包含太多的其它类别的点。(对距离加权,可以降低k值设定的影响) k值通常是采用交叉检验来确定(以k=1为基准) 经验规则:k一般低于训练样本数的平方根
2. 类别如何判定最合适? 投票法没有考虑近邻的距离的远近,距离更近的近邻也许更应该决定最终的分类,所以加权投票法更恰当一些。
3. 如何选择合适的距离衡量? 高维度对距离衡量的影响:众所周知当变量数越多,欧式距离的区分能力就越差。 变量值域对距离的影响:值域越大的变量常常会在距离计算中占据主导作用,因此应先对变量进行标准化。
4. 训练样本是否要一视同仁? 在训练集中,有些样本可能是更值得依赖的。 可以给不同的样本施加不同的权重,加强依赖样本的权重,降低不可信赖样本的影响。
5. 性能问题? KNN是一种懒惰算法,平时不好好学习,考试(对测试样本分类)时才临阵磨枪(临时去找k个近邻)。 懒惰的后果:构造模型很简单,但在对测试样本分类地的系统开销大,因为要扫描全部训练样本并计算距离。 已经有一些方法提高计算的效率,例如压缩训练样本量等。
6. 能否大幅减少训练样本量,同时又保持分类精度? 浓缩技术(condensing) 编辑技术(editing)
算法实例 如scikit-learn中的KNN算法使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #coding:utf-8 from sklearn import datasets #sk-learn 内置数据库 import numpy as np &#39;&#39;&#39;KNN算法&#39;&#39;&#39; iris = datasets.</description>
</item>
<item>
<title>L1L2正则</title>
<link>https://reid00.github.io/posts/ml/l1l2%E6%AD%A3%E5%88%99/</link>
<pubDate>Thu, 16 Mar 2023 19:35:18 +0800</pubDate>
<guid>https://reid00.github.io/posts/ml/l1l2%E6%AD%A3%E5%88%99/</guid>
<description>概念 L0:计算非零个数,用于产生稀疏性,但是在实际研究中很少用,因为L0范数很难优化求解,是一个NP-hard问题,因此更多情况下我们是使用L1范数 L1:计算绝对值之和,用以产生稀疏性,因为它是L0范式的一个最优凸近似,容易优化求解 L2:计算平方和再开根号,L2范数更多是防止过拟合,并且让优化求解变得稳定很快速(这是因为加入了L2范式之后,满足了强凸)。
L1范数(Lasso Regularization):向量中各个元素绝对值的和。
L2范数(Ridge Regression):向量中各元素平方和再求平方根。
作用 L1正则化可以产生稀疏权值矩阵,即产生一个稀疏模型,可以用于特征选择
L2正则化可以防止模型过拟合(overfitting);一定程度上,L1也可以防止过拟合
L1正则化是在代价函数后面加上 L2正则化是在代价函数后面增加了
两者都起到一定的过拟合作用,两者都对应一定的先验知识,L1对应拉普拉斯分布,L2对应高斯分布,L1偏向于参数稀疏性,L2偏向于参数分布较为稠。</description>
</item>
<item>
<title>Self Attention</title>
<link>https://reid00.github.io/posts/ml/self-attention/</link>
<pubDate>Thu, 16 Mar 2023 19:35:18 +0800</pubDate>
<guid>https://reid00.github.io/posts/ml/self-attention/</guid>
<description>Refer :https://blog.csdn.net/shenfuli/article/details/106523650
Multi-Head Attention: https://blog.csdn.net/qq_37394634/article/details/102679096</description>
</item>
<item>