"
577 | ],
578 | "text/plain": [
579 | " Dst Port Protocol Timestamp Flow Duration Tot Fwd Pkts \\\n",
580 | "0 0 0 15/02/2018 08:25:18 112641158 3 \n",
581 | "1 22 6 15/02/2018 08:29:05 37366762 14 \n",
582 | "2 47514 6 15/02/2018 08:29:42 543 2 \n",
583 | "3 0 0 15/02/2018 08:28:07 112640703 3 \n",
584 | "4 0 0 15/02/2018 08:30:56 112640874 3 \n",
585 | "\n",
586 | " Tot Bwd Pkts TotLen Fwd Pkts TotLen Bwd Pkts Fwd Pkt Len Max \\\n",
587 | "0 0 0 0 0 \n",
588 | "1 12 2168 2993 712 \n",
589 | "2 0 64 0 64 \n",
590 | "3 0 0 0 0 \n",
591 | "4 0 0 0 0 \n",
592 | "\n",
593 | " Fwd Pkt Len Min Fwd Pkt Len Mean Fwd Pkt Len Std Bwd Pkt Len Max \\\n",
594 | "0 0 0.000000 0.000000 0 \n",
595 | "1 0 154.857143 254.855270 976 \n",
596 | "2 0 32.000000 45.254834 0 \n",
597 | "3 0 0.000000 0.000000 0 \n",
598 | "4 0 0.000000 0.000000 0 \n",
599 | "\n",
600 | " Bwd Pkt Len Min Bwd Pkt Len Mean Bwd Pkt Len Std Flow Byts/s \\\n",
601 | "0 0 0.000000 0.000000 0.000000 \n",
602 | "1 0 249.416667 395.929392 138.117400 \n",
603 | "2 0 0.000000 0.000000 117863.720074 \n",
604 | "3 0 0.000000 0.000000 0.000000 \n",
605 | "4 0 0.000000 0.000000 0.000000 \n",
606 | "\n",
607 | " Flow Pkts/s Flow IAT Mean Flow IAT Std Flow IAT Max Flow IAT Min \\\n",
608 | "0 0.026633 56320579.00 7.042784e+02 56321077 56320081 \n",
609 | "1 0.695806 1494670.48 3.894924e+06 15617415 7 \n",
610 | "2 3683.241252 543.00 0.000000e+00 543 543 \n",
611 | "3 0.026633 56320351.50 3.669884e+02 56320611 56320092 \n",
612 | "4 0.026633 56320437.00 7.198347e+02 56320946 56319928 \n",
613 | "\n",
614 | " Fwd IAT Tot Fwd IAT Mean Fwd IAT Std Fwd IAT Max Fwd IAT Min \\\n",
615 | "0 112641158 5.632058e+07 7.042784e+02 56321077 56320081 \n",
616 | "1 37366762 2.874366e+06 5.104444e+06 15617415 40 \n",
617 | "2 543 5.430000e+02 0.000000e+00 543 543 \n",
618 | "3 112640703 5.632035e+07 3.669884e+02 56320611 56320092 \n",
619 | "4 112640874 5.632044e+07 7.198347e+02 56320946 56319928 \n",
620 | "\n",
621 | " Bwd IAT Tot Bwd IAT Mean Bwd IAT Std Bwd IAT Max Bwd IAT Min \\\n",
622 | "0 0 0.000000e+00 0.000000e+00 0 0 \n",
623 | "1 37366730 3.396975e+06 5.564224e+06 15936762 893 \n",
624 | "2 0 0.000000e+00 0.000000e+00 0 0 \n",
625 | "3 0 0.000000e+00 0.000000e+00 0 0 \n",
626 | "4 0 0.000000e+00 0.000000e+00 0 0 \n",
627 | "\n",
628 | " Fwd PSH Flags Bwd PSH Flags Fwd URG Flags Bwd URG Flags Fwd Header Len \\\n",
629 | "0 0 0 0 0 0 \n",
630 | "1 0 0 0 0 456 \n",
631 | "2 1 0 0 0 64 \n",
632 | "3 0 0 0 0 0 \n",
633 | "4 0 0 0 0 0 \n",
634 | "\n",
635 | " Bwd Header Len Fwd Pkts/s Bwd Pkts/s Pkt Len Min Pkt Len Max \\\n",
636 | "0 0 0.026633 0.000000 0 0 \n",
637 | "1 416 0.374665 0.321141 0 976 \n",
638 | "2 0 3683.241252 0.000000 0 64 \n",
639 | "3 0 0.026633 0.000000 0 0 \n",
640 | "4 0 0.026633 0.000000 0 0 \n",
641 | "\n",
642 | " Pkt Len Mean Pkt Len Std Pkt Len Var FIN Flag Cnt SYN Flag Cnt \\\n",
643 | "0 0.000000 0.000000 0.000000 0 0 \n",
644 | "1 191.148148 320.122898 102478.669516 0 0 \n",
645 | "2 42.666667 36.950417 1365.333333 0 1 \n",
646 | "3 0.000000 0.000000 0.000000 0 0 \n",
647 | "4 0.000000 0.000000 0.000000 0 0 \n",
648 | "\n",
649 | " RST Flag Cnt PSH Flag Cnt ACK Flag Cnt URG Flag Cnt CWE Flag Count \\\n",
650 | "0 0 0 0 0 0 \n",
651 | "1 0 1 0 0 0 \n",
652 | "2 0 0 1 0 0 \n",
653 | "3 0 0 0 0 0 \n",
654 | "4 0 0 0 0 0 \n",
655 | "\n",
656 | " ECE Flag Cnt Down/Up Ratio Pkt Size Avg Fwd Seg Size Avg \\\n",
657 | "0 0 0 0.0 0.000000 \n",
658 | "1 0 0 198.5 154.857143 \n",
659 | "2 0 0 64.0 32.000000 \n",
660 | "3 0 0 0.0 0.000000 \n",
661 | "4 0 0 0.0 0.000000 \n",
662 | "\n",
663 | " Bwd Seg Size Avg Fwd Byts/b Avg Fwd Pkts/b Avg Fwd Blk Rate Avg \\\n",
664 | "0 0.000000 0 0 0 \n",
665 | "1 249.416667 0 0 0 \n",
666 | "2 0.000000 0 0 0 \n",
667 | "3 0.000000 0 0 0 \n",
668 | "4 0.000000 0 0 0 \n",
669 | "\n",
670 | " Bwd Byts/b Avg Bwd Pkts/b Avg Bwd Blk Rate Avg Subflow Fwd Pkts \\\n",
671 | "0 0 0 0 3 \n",
672 | "1 0 0 0 14 \n",
673 | "2 0 0 0 2 \n",
674 | "3 0 0 0 3 \n",
675 | "4 0 0 0 3 \n",
676 | "\n",
677 | " Subflow Fwd Byts Subflow Bwd Pkts Subflow Bwd Byts Init Fwd Win Byts \\\n",
678 | "0 0 0 0 -1 \n",
679 | "1 2168 12 2993 29200 \n",
680 | "2 64 0 0 244 \n",
681 | "3 0 0 0 -1 \n",
682 | "4 0 0 0 -1 \n",
683 | "\n",
684 | " Init Bwd Win Byts Fwd Act Data Pkts Fwd Seg Size Min Active Mean \\\n",
685 | "0 -1 0 0 0.0 \n",
686 | "1 232 8 32 1024353.0 \n",
687 | "2 -1 0 32 0.0 \n",
688 | "3 -1 0 0 0.0 \n",
689 | "4 -1 0 0 0.0 \n",
690 | "\n",
691 | " Active Std Active Max Active Min Idle Mean Idle Std Idle Max \\\n",
692 | "0 0.000000 0 0 56320579.0 7.042784e+02 56321077 \n",
693 | "1 649038.754495 1601183 321569 11431221.0 3.644991e+06 15617415 \n",
694 | "2 0.000000 0 0 0.0 0.000000e+00 0 \n",
695 | "3 0.000000 0 0 56320351.5 3.669884e+02 56320611 \n",
696 | "4 0.000000 0 0 56320437.0 7.198347e+02 56320946 \n",
697 | "\n",
698 | " Idle Min Label \n",
699 | "0 56320081 Benign \n",
700 | "1 8960247 Benign \n",
701 | "2 0 Benign \n",
702 | "3 56320092 Benign \n",
703 | "4 56319928 Benign "
704 | ]
705 | },
706 | "execution_count": 6,
707 | "metadata": {},
708 | "output_type": "execute_result"
709 | }
710 | ],
711 | "source": [
712 | "data.head()"
713 | ]
714 | },
715 | {
716 | "cell_type": "code",
717 | "execution_count": 9,
718 | "metadata": {},
719 | "outputs": [
720 | {
721 | "data": {
722 | "text/plain": [
723 | "array([ 0, 6, 17], dtype=int64)"
724 | ]
725 | },
726 | "execution_count": 9,
727 | "metadata": {},
728 | "output_type": "execute_result"
729 | }
730 | ],
731 | "source": [
732 | "data['Protocol'].unique()"
733 | ]
734 | },
735 | {
736 | "cell_type": "code",
737 | "execution_count": null,
738 | "metadata": {},
739 | "outputs": [],
740 | "source": []
741 | }
742 | ],
743 | "metadata": {
744 | "kernelspec": {
745 | "display_name": "Python 3",
746 | "language": "python",
747 | "name": "python3"
748 | },
749 | "language_info": {
750 | "codemirror_mode": {
751 | "name": "ipython",
752 | "version": 3
753 | },
754 | "file_extension": ".py",
755 | "mimetype": "text/x-python",
756 | "name": "python",
757 | "nbconvert_exporter": "python",
758 | "pygments_lexer": "ipython3",
759 | "version": "3.7.9"
760 | }
761 | },
762 | "nbformat": 4,
763 | "nbformat_minor": 4
764 | }
765 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | GNU GENERAL PUBLIC LICENSE
2 | Version 3, 29 June 2007
3 |
4 | Copyright (C) 2007 Free Software Foundation, Inc.
5 | Everyone is permitted to copy and distribute verbatim copies
6 | of this license document, but changing it is not allowed.
7 |
8 | Preamble
9 |
10 | The GNU General Public License is a free, copyleft license for
11 | software and other kinds of works.
12 |
13 | The licenses for most software and other practical works are designed
14 | to take away your freedom to share and change the works. By contrast,
15 | the GNU General Public License is intended to guarantee your freedom to
16 | share and change all versions of a program--to make sure it remains free
17 | software for all its users. We, the Free Software Foundation, use the
18 | GNU General Public License for most of our software; it applies also to
19 | any other work released this way by its authors. You can apply it to
20 | your programs, too.
21 |
22 | When we speak of free software, we are referring to freedom, not
23 | price. Our General Public Licenses are designed to make sure that you
24 | have the freedom to distribute copies of free software (and charge for
25 | them if you wish), that you receive source code or can get it if you
26 | want it, that you can change the software or use pieces of it in new
27 | free programs, and that you know you can do these things.
28 |
29 | To protect your rights, we need to prevent others from denying you
30 | these rights or asking you to surrender the rights. Therefore, you have
31 | certain responsibilities if you distribute copies of the software, or if
32 | you modify it: responsibilities to respect the freedom of others.
33 |
34 | For example, if you distribute copies of such a program, whether
35 | gratis or for a fee, you must pass on to the recipients the same
36 | freedoms that you received. You must make sure that they, too, receive
37 | or can get the source code. And you must show them these terms so they
38 | know their rights.
39 |
40 | Developers that use the GNU GPL protect your rights with two steps:
41 | (1) assert copyright on the software, and (2) offer you this License
42 | giving you legal permission to copy, distribute and/or modify it.
43 |
44 | For the developers' and authors' protection, the GPL clearly explains
45 | that there is no warranty for this free software. For both users' and
46 | authors' sake, the GPL requires that modified versions be marked as
47 | changed, so that their problems will not be attributed erroneously to
48 | authors of previous versions.
49 |
50 | Some devices are designed to deny users access to install or run
51 | modified versions of the software inside them, although the manufacturer
52 | can do so. This is fundamentally incompatible with the aim of
53 | protecting users' freedom to change the software. The systematic
54 | pattern of such abuse occurs in the area of products for individuals to
55 | use, which is precisely where it is most unacceptable. Therefore, we
56 | have designed this version of the GPL to prohibit the practice for those
57 | products. If such problems arise substantially in other domains, we
58 | stand ready to extend this provision to those domains in future versions
59 | of the GPL, as needed to protect the freedom of users.
60 |
61 | Finally, every program is threatened constantly by software patents.
62 | States should not allow patents to restrict development and use of
63 | software on general-purpose computers, but in those that do, we wish to
64 | avoid the special danger that patents applied to a free program could
65 | make it effectively proprietary. To prevent this, the GPL assures that
66 | patents cannot be used to render the program non-free.
67 |
68 | The precise terms and conditions for copying, distribution and
69 | modification follow.
70 |
71 | TERMS AND CONDITIONS
72 |
73 | 0. Definitions.
74 |
75 | "This License" refers to version 3 of the GNU General Public License.
76 |
77 | "Copyright" also means copyright-like laws that apply to other kinds of
78 | works, such as semiconductor masks.
79 |
80 | "The Program" refers to any copyrightable work licensed under this
81 | License. Each licensee is addressed as "you". "Licensees" and
82 | "recipients" may be individuals or organizations.
83 |
84 | To "modify" a work means to copy from or adapt all or part of the work
85 | in a fashion requiring copyright permission, other than the making of an
86 | exact copy. The resulting work is called a "modified version" of the
87 | earlier work or a work "based on" the earlier work.
88 |
89 | A "covered work" means either the unmodified Program or a work based
90 | on the Program.
91 |
92 | To "propagate" a work means to do anything with it that, without
93 | permission, would make you directly or secondarily liable for
94 | infringement under applicable copyright law, except executing it on a
95 | computer or modifying a private copy. Propagation includes copying,
96 | distribution (with or without modification), making available to the
97 | public, and in some countries other activities as well.
98 |
99 | To "convey" a work means any kind of propagation that enables other
100 | parties to make or receive copies. Mere interaction with a user through
101 | a computer network, with no transfer of a copy, is not conveying.
102 |
103 | An interactive user interface displays "Appropriate Legal Notices"
104 | to the extent that it includes a convenient and prominently visible
105 | feature that (1) displays an appropriate copyright notice, and (2)
106 | tells the user that there is no warranty for the work (except to the
107 | extent that warranties are provided), that licensees may convey the
108 | work under this License, and how to view a copy of this License. If
109 | the interface presents a list of user commands or options, such as a
110 | menu, a prominent item in the list meets this criterion.
111 |
112 | 1. Source Code.
113 |
114 | The "source code" for a work means the preferred form of the work
115 | for making modifications to it. "Object code" means any non-source
116 | form of a work.
117 |
118 | A "Standard Interface" means an interface that either is an official
119 | standard defined by a recognized standards body, or, in the case of
120 | interfaces specified for a particular programming language, one that
121 | is widely used among developers working in that language.
122 |
123 | The "System Libraries" of an executable work include anything, other
124 | than the work as a whole, that (a) is included in the normal form of
125 | packaging a Major Component, but which is not part of that Major
126 | Component, and (b) serves only to enable use of the work with that
127 | Major Component, or to implement a Standard Interface for which an
128 | implementation is available to the public in source code form. A
129 | "Major Component", in this context, means a major essential component
130 | (kernel, window system, and so on) of the specific operating system
131 | (if any) on which the executable work runs, or a compiler used to
132 | produce the work, or an object code interpreter used to run it.
133 |
134 | The "Corresponding Source" for a work in object code form means all
135 | the source code needed to generate, install, and (for an executable
136 | work) run the object code and to modify the work, including scripts to
137 | control those activities. However, it does not include the work's
138 | System Libraries, or general-purpose tools or generally available free
139 | programs which are used unmodified in performing those activities but
140 | which are not part of the work. For example, Corresponding Source
141 | includes interface definition files associated with source files for
142 | the work, and the source code for shared libraries and dynamically
143 | linked subprograms that the work is specifically designed to require,
144 | such as by intimate data communication or control flow between those
145 | subprograms and other parts of the work.
146 |
147 | The Corresponding Source need not include anything that users
148 | can regenerate automatically from other parts of the Corresponding
149 | Source.
150 |
151 | The Corresponding Source for a work in source code form is that
152 | same work.
153 |
154 | 2. Basic Permissions.
155 |
156 | All rights granted under this License are granted for the term of
157 | copyright on the Program, and are irrevocable provided the stated
158 | conditions are met. This License explicitly affirms your unlimited
159 | permission to run the unmodified Program. The output from running a
160 | covered work is covered by this License only if the output, given its
161 | content, constitutes a covered work. This License acknowledges your
162 | rights of fair use or other equivalent, as provided by copyright law.
163 |
164 | You may make, run and propagate covered works that you do not
165 | convey, without conditions so long as your license otherwise remains
166 | in force. You may convey covered works to others for the sole purpose
167 | of having them make modifications exclusively for you, or provide you
168 | with facilities for running those works, provided that you comply with
169 | the terms of this License in conveying all material for which you do
170 | not control copyright. Those thus making or running the covered works
171 | for you must do so exclusively on your behalf, under your direction
172 | and control, on terms that prohibit them from making any copies of
173 | your copyrighted material outside their relationship with you.
174 |
175 | Conveying under any other circumstances is permitted solely under
176 | the conditions stated below. Sublicensing is not allowed; section 10
177 | makes it unnecessary.
178 |
179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180 |
181 | No covered work shall be deemed part of an effective technological
182 | measure under any applicable law fulfilling obligations under article
183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or
184 | similar laws prohibiting or restricting circumvention of such
185 | measures.
186 |
187 | When you convey a covered work, you waive any legal power to forbid
188 | circumvention of technological measures to the extent such circumvention
189 | is effected by exercising rights under this License with respect to
190 | the covered work, and you disclaim any intention to limit operation or
191 | modification of the work as a means of enforcing, against the work's
192 | users, your or third parties' legal rights to forbid circumvention of
193 | technological measures.
194 |
195 | 4. Conveying Verbatim Copies.
196 |
197 | You may convey verbatim copies of the Program's source code as you
198 | receive it, in any medium, provided that you conspicuously and
199 | appropriately publish on each copy an appropriate copyright notice;
200 | keep intact all notices stating that this License and any
201 | non-permissive terms added in accord with section 7 apply to the code;
202 | keep intact all notices of the absence of any warranty; and give all
203 | recipients a copy of this License along with the Program.
204 |
205 | You may charge any price or no price for each copy that you convey,
206 | and you may offer support or warranty protection for a fee.
207 |
208 | 5. Conveying Modified Source Versions.
209 |
210 | You may convey a work based on the Program, or the modifications to
211 | produce it from the Program, in the form of source code under the
212 | terms of section 4, provided that you also meet all of these conditions:
213 |
214 | a) The work must carry prominent notices stating that you modified
215 | it, and giving a relevant date.
216 |
217 | b) The work must carry prominent notices stating that it is
218 | released under this License and any conditions added under section
219 | 7. This requirement modifies the requirement in section 4 to
220 | "keep intact all notices".
221 |
222 | c) You must license the entire work, as a whole, under this
223 | License to anyone who comes into possession of a copy. This
224 | License will therefore apply, along with any applicable section 7
225 | additional terms, to the whole of the work, and all its parts,
226 | regardless of how they are packaged. This License gives no
227 | permission to license the work in any other way, but it does not
228 | invalidate such permission if you have separately received it.
229 |
230 | d) If the work has interactive user interfaces, each must display
231 | Appropriate Legal Notices; however, if the Program has interactive
232 | interfaces that do not display Appropriate Legal Notices, your
233 | work need not make them do so.
234 |
235 | A compilation of a covered work with other separate and independent
236 | works, which are not by their nature extensions of the covered work,
237 | and which are not combined with it such as to form a larger program,
238 | in or on a volume of a storage or distribution medium, is called an
239 | "aggregate" if the compilation and its resulting copyright are not
240 | used to limit the access or legal rights of the compilation's users
241 | beyond what the individual works permit. Inclusion of a covered work
242 | in an aggregate does not cause this License to apply to the other
243 | parts of the aggregate.
244 |
245 | 6. Conveying Non-Source Forms.
246 |
247 | You may convey a covered work in object code form under the terms
248 | of sections 4 and 5, provided that you also convey the
249 | machine-readable Corresponding Source under the terms of this License,
250 | in one of these ways:
251 |
252 | a) Convey the object code in, or embodied in, a physical product
253 | (including a physical distribution medium), accompanied by the
254 | Corresponding Source fixed on a durable physical medium
255 | customarily used for software interchange.
256 |
257 | b) Convey the object code in, or embodied in, a physical product
258 | (including a physical distribution medium), accompanied by a
259 | written offer, valid for at least three years and valid for as
260 | long as you offer spare parts or customer support for that product
261 | model, to give anyone who possesses the object code either (1) a
262 | copy of the Corresponding Source for all the software in the
263 | product that is covered by this License, on a durable physical
264 | medium customarily used for software interchange, for a price no
265 | more than your reasonable cost of physically performing this
266 | conveying of source, or (2) access to copy the
267 | Corresponding Source from a network server at no charge.
268 |
269 | c) Convey individual copies of the object code with a copy of the
270 | written offer to provide the Corresponding Source. This
271 | alternative is allowed only occasionally and noncommercially, and
272 | only if you received the object code with such an offer, in accord
273 | with subsection 6b.
274 |
275 | d) Convey the object code by offering access from a designated
276 | place (gratis or for a charge), and offer equivalent access to the
277 | Corresponding Source in the same way through the same place at no
278 | further charge. You need not require recipients to copy the
279 | Corresponding Source along with the object code. If the place to
280 | copy the object code is a network server, the Corresponding Source
281 | may be on a different server (operated by you or a third party)
282 | that supports equivalent copying facilities, provided you maintain
283 | clear directions next to the object code saying where to find the
284 | Corresponding Source. Regardless of what server hosts the
285 | Corresponding Source, you remain obligated to ensure that it is
286 | available for as long as needed to satisfy these requirements.
287 |
288 | e) Convey the object code using peer-to-peer transmission, provided
289 | you inform other peers where the object code and Corresponding
290 | Source of the work are being offered to the general public at no
291 | charge under subsection 6d.
292 |
293 | A separable portion of the object code, whose source code is excluded
294 | from the Corresponding Source as a System Library, need not be
295 | included in conveying the object code work.
296 |
297 | A "User Product" is either (1) a "consumer product", which means any
298 | tangible personal property which is normally used for personal, family,
299 | or household purposes, or (2) anything designed or sold for incorporation
300 | into a dwelling. In determining whether a product is a consumer product,
301 | doubtful cases shall be resolved in favor of coverage. For a particular
302 | product received by a particular user, "normally used" refers to a
303 | typical or common use of that class of product, regardless of the status
304 | of the particular user or of the way in which the particular user
305 | actually uses, or expects or is expected to use, the product. A product
306 | is a consumer product regardless of whether the product has substantial
307 | commercial, industrial or non-consumer uses, unless such uses represent
308 | the only significant mode of use of the product.
309 |
310 | "Installation Information" for a User Product means any methods,
311 | procedures, authorization keys, or other information required to install
312 | and execute modified versions of a covered work in that User Product from
313 | a modified version of its Corresponding Source. The information must
314 | suffice to ensure that the continued functioning of the modified object
315 | code is in no case prevented or interfered with solely because
316 | modification has been made.
317 |
318 | If you convey an object code work under this section in, or with, or
319 | specifically for use in, a User Product, and the conveying occurs as
320 | part of a transaction in which the right of possession and use of the
321 | User Product is transferred to the recipient in perpetuity or for a
322 | fixed term (regardless of how the transaction is characterized), the
323 | Corresponding Source conveyed under this section must be accompanied
324 | by the Installation Information. But this requirement does not apply
325 | if neither you nor any third party retains the ability to install
326 | modified object code on the User Product (for example, the work has
327 | been installed in ROM).
328 |
329 | The requirement to provide Installation Information does not include a
330 | requirement to continue to provide support service, warranty, or updates
331 | for a work that has been modified or installed by the recipient, or for
332 | the User Product in which it has been modified or installed. Access to a
333 | network may be denied when the modification itself materially and
334 | adversely affects the operation of the network or violates the rules and
335 | protocols for communication across the network.
336 |
337 | Corresponding Source conveyed, and Installation Information provided,
338 | in accord with this section must be in a format that is publicly
339 | documented (and with an implementation available to the public in
340 | source code form), and must require no special password or key for
341 | unpacking, reading or copying.
342 |
343 | 7. Additional Terms.
344 |
345 | "Additional permissions" are terms that supplement the terms of this
346 | License by making exceptions from one or more of its conditions.
347 | Additional permissions that are applicable to the entire Program shall
348 | be treated as though they were included in this License, to the extent
349 | that they are valid under applicable law. If additional permissions
350 | apply only to part of the Program, that part may be used separately
351 | under those permissions, but the entire Program remains governed by
352 | this License without regard to the additional permissions.
353 |
354 | When you convey a copy of a covered work, you may at your option
355 | remove any additional permissions from that copy, or from any part of
356 | it. (Additional permissions may be written to require their own
357 | removal in certain cases when you modify the work.) You may place
358 | additional permissions on material, added by you to a covered work,
359 | for which you have or can give appropriate copyright permission.
360 |
361 | Notwithstanding any other provision of this License, for material you
362 | add to a covered work, you may (if authorized by the copyright holders of
363 | that material) supplement the terms of this License with terms:
364 |
365 | a) Disclaiming warranty or limiting liability differently from the
366 | terms of sections 15 and 16 of this License; or
367 |
368 | b) Requiring preservation of specified reasonable legal notices or
369 | author attributions in that material or in the Appropriate Legal
370 | Notices displayed by works containing it; or
371 |
372 | c) Prohibiting misrepresentation of the origin of that material, or
373 | requiring that modified versions of such material be marked in
374 | reasonable ways as different from the original version; or
375 |
376 | d) Limiting the use for publicity purposes of names of licensors or
377 | authors of the material; or
378 |
379 | e) Declining to grant rights under trademark law for use of some
380 | trade names, trademarks, or service marks; or
381 |
382 | f) Requiring indemnification of licensors and authors of that
383 | material by anyone who conveys the material (or modified versions of
384 | it) with contractual assumptions of liability to the recipient, for
385 | any liability that these contractual assumptions directly impose on
386 | those licensors and authors.
387 |
388 | All other non-permissive additional terms are considered "further
389 | restrictions" within the meaning of section 10. If the Program as you
390 | received it, or any part of it, contains a notice stating that it is
391 | governed by this License along with a term that is a further
392 | restriction, you may remove that term. If a license document contains
393 | a further restriction but permits relicensing or conveying under this
394 | License, you may add to a covered work material governed by the terms
395 | of that license document, provided that the further restriction does
396 | not survive such relicensing or conveying.
397 |
398 | If you add terms to a covered work in accord with this section, you
399 | must place, in the relevant source files, a statement of the
400 | additional terms that apply to those files, or a notice indicating
401 | where to find the applicable terms.
402 |
403 | Additional terms, permissive or non-permissive, may be stated in the
404 | form of a separately written license, or stated as exceptions;
405 | the above requirements apply either way.
406 |
407 | 8. Termination.
408 |
409 | You may not propagate or modify a covered work except as expressly
410 | provided under this License. Any attempt otherwise to propagate or
411 | modify it is void, and will automatically terminate your rights under
412 | this License (including any patent licenses granted under the third
413 | paragraph of section 11).
414 |
415 | However, if you cease all violation of this License, then your
416 | license from a particular copyright holder is reinstated (a)
417 | provisionally, unless and until the copyright holder explicitly and
418 | finally terminates your license, and (b) permanently, if the copyright
419 | holder fails to notify you of the violation by some reasonable means
420 | prior to 60 days after the cessation.
421 |
422 | Moreover, your license from a particular copyright holder is
423 | reinstated permanently if the copyright holder notifies you of the
424 | violation by some reasonable means, this is the first time you have
425 | received notice of violation of this License (for any work) from that
426 | copyright holder, and you cure the violation prior to 30 days after
427 | your receipt of the notice.
428 |
429 | Termination of your rights under this section does not terminate the
430 | licenses of parties who have received copies or rights from you under
431 | this License. If your rights have been terminated and not permanently
432 | reinstated, you do not qualify to receive new licenses for the same
433 | material under section 10.
434 |
435 | 9. Acceptance Not Required for Having Copies.
436 |
437 | You are not required to accept this License in order to receive or
438 | run a copy of the Program. Ancillary propagation of a covered work
439 | occurring solely as a consequence of using peer-to-peer transmission
440 | to receive a copy likewise does not require acceptance. However,
441 | nothing other than this License grants you permission to propagate or
442 | modify any covered work. These actions infringe copyright if you do
443 | not accept this License. Therefore, by modifying or propagating a
444 | covered work, you indicate your acceptance of this License to do so.
445 |
446 | 10. Automatic Licensing of Downstream Recipients.
447 |
448 | Each time you convey a covered work, the recipient automatically
449 | receives a license from the original licensors, to run, modify and
450 | propagate that work, subject to this License. You are not responsible
451 | for enforcing compliance by third parties with this License.
452 |
453 | An "entity transaction" is a transaction transferring control of an
454 | organization, or substantially all assets of one, or subdividing an
455 | organization, or merging organizations. If propagation of a covered
456 | work results from an entity transaction, each party to that
457 | transaction who receives a copy of the work also receives whatever
458 | licenses to the work the party's predecessor in interest had or could
459 | give under the previous paragraph, plus a right to possession of the
460 | Corresponding Source of the work from the predecessor in interest, if
461 | the predecessor has it or can get it with reasonable efforts.
462 |
463 | You may not impose any further restrictions on the exercise of the
464 | rights granted or affirmed under this License. For example, you may
465 | not impose a license fee, royalty, or other charge for exercise of
466 | rights granted under this License, and you may not initiate litigation
467 | (including a cross-claim or counterclaim in a lawsuit) alleging that
468 | any patent claim is infringed by making, using, selling, offering for
469 | sale, or importing the Program or any portion of it.
470 |
471 | 11. Patents.
472 |
473 | A "contributor" is a copyright holder who authorizes use under this
474 | License of the Program or a work on which the Program is based. The
475 | work thus licensed is called the contributor's "contributor version".
476 |
477 | A contributor's "essential patent claims" are all patent claims
478 | owned or controlled by the contributor, whether already acquired or
479 | hereafter acquired, that would be infringed by some manner, permitted
480 | by this License, of making, using, or selling its contributor version,
481 | but do not include claims that would be infringed only as a
482 | consequence of further modification of the contributor version. For
483 | purposes of this definition, "control" includes the right to grant
484 | patent sublicenses in a manner consistent with the requirements of
485 | this License.
486 |
487 | Each contributor grants you a non-exclusive, worldwide, royalty-free
488 | patent license under the contributor's essential patent claims, to
489 | make, use, sell, offer for sale, import and otherwise run, modify and
490 | propagate the contents of its contributor version.
491 |
492 | In the following three paragraphs, a "patent license" is any express
493 | agreement or commitment, however denominated, not to enforce a patent
494 | (such as an express permission to practice a patent or covenant not to
495 | sue for patent infringement). To "grant" such a patent license to a
496 | party means to make such an agreement or commitment not to enforce a
497 | patent against the party.
498 |
499 | If you convey a covered work, knowingly relying on a patent license,
500 | and the Corresponding Source of the work is not available for anyone
501 | to copy, free of charge and under the terms of this License, through a
502 | publicly available network server or other readily accessible means,
503 | then you must either (1) cause the Corresponding Source to be so
504 | available, or (2) arrange to deprive yourself of the benefit of the
505 | patent license for this particular work, or (3) arrange, in a manner
506 | consistent with the requirements of this License, to extend the patent
507 | license to downstream recipients. "Knowingly relying" means you have
508 | actual knowledge that, but for the patent license, your conveying the
509 | covered work in a country, or your recipient's use of the covered work
510 | in a country, would infringe one or more identifiable patents in that
511 | country that you have reason to believe are valid.
512 |
513 | If, pursuant to or in connection with a single transaction or
514 | arrangement, you convey, or propagate by procuring conveyance of, a
515 | covered work, and grant a patent license to some of the parties
516 | receiving the covered work authorizing them to use, propagate, modify
517 | or convey a specific copy of the covered work, then the patent license
518 | you grant is automatically extended to all recipients of the covered
519 | work and works based on it.
520 |
521 | A patent license is "discriminatory" if it does not include within
522 | the scope of its coverage, prohibits the exercise of, or is
523 | conditioned on the non-exercise of one or more of the rights that are
524 | specifically granted under this License. You may not convey a covered
525 | work if you are a party to an arrangement with a third party that is
526 | in the business of distributing software, under which you make payment
527 | to the third party based on the extent of your activity of conveying
528 | the work, and under which the third party grants, to any of the
529 | parties who would receive the covered work from you, a discriminatory
530 | patent license (a) in connection with copies of the covered work
531 | conveyed by you (or copies made from those copies), or (b) primarily
532 | for and in connection with specific products or compilations that
533 | contain the covered work, unless you entered into that arrangement,
534 | or that patent license was granted, prior to 28 March 2007.
535 |
536 | Nothing in this License shall be construed as excluding or limiting
537 | any implied license or other defenses to infringement that may
538 | otherwise be available to you under applicable patent law.
539 |
540 | 12. No Surrender of Others' Freedom.
541 |
542 | If conditions are imposed on you (whether by court order, agreement or
543 | otherwise) that contradict the conditions of this License, they do not
544 | excuse you from the conditions of this License. If you cannot convey a
545 | covered work so as to satisfy simultaneously your obligations under this
546 | License and any other pertinent obligations, then as a consequence you may
547 | not convey it at all. For example, if you agree to terms that obligate you
548 | to collect a royalty for further conveying from those to whom you convey
549 | the Program, the only way you could satisfy both those terms and this
550 | License would be to refrain entirely from conveying the Program.
551 |
552 | 13. Use with the GNU Affero General Public License.
553 |
554 | Notwithstanding any other provision of this License, you have
555 | permission to link or combine any covered work with a work licensed
556 | under version 3 of the GNU Affero General Public License into a single
557 | combined work, and to convey the resulting work. The terms of this
558 | License will continue to apply to the part which is the covered work,
559 | but the special requirements of the GNU Affero General Public License,
560 | section 13, concerning interaction through a network will apply to the
561 | combination as such.
562 |
563 | 14. Revised Versions of this License.
564 |
565 | The Free Software Foundation may publish revised and/or new versions of
566 | the GNU General Public License from time to time. Such new versions will
567 | be similar in spirit to the present version, but may differ in detail to
568 | address new problems or concerns.
569 |
570 | Each version is given a distinguishing version number. If the
571 | Program specifies that a certain numbered version of the GNU General
572 | Public License "or any later version" applies to it, you have the
573 | option of following the terms and conditions either of that numbered
574 | version or of any later version published by the Free Software
575 | Foundation. If the Program does not specify a version number of the
576 | GNU General Public License, you may choose any version ever published
577 | by the Free Software Foundation.
578 |
579 | If the Program specifies that a proxy can decide which future
580 | versions of the GNU General Public License can be used, that proxy's
581 | public statement of acceptance of a version permanently authorizes you
582 | to choose that version for the Program.
583 |
584 | Later license versions may give you additional or different
585 | permissions. However, no additional obligations are imposed on any
586 | author or copyright holder as a result of your choosing to follow a
587 | later version.
588 |
589 | 15. Disclaimer of Warranty.
590 |
591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599 |
600 | 16. Limitation of Liability.
601 |
602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610 | SUCH DAMAGES.
611 |
612 | 17. Interpretation of Sections 15 and 16.
613 |
614 | If the disclaimer of warranty and limitation of liability provided
615 | above cannot be given local legal effect according to their terms,
616 | reviewing courts shall apply local law that most closely approximates
617 | an absolute waiver of all civil liability in connection with the
618 | Program, unless a warranty or assumption of liability accompanies a
619 | copy of the Program in return for a fee.
620 |
621 | END OF TERMS AND CONDITIONS
622 |
623 | How to Apply These Terms to Your New Programs
624 |
625 | If you develop a new program, and you want it to be of the greatest
626 | possible use to the public, the best way to achieve this is to make it
627 | free software which everyone can redistribute and change under these terms.
628 |
629 | To do so, attach the following notices to the program. It is safest
630 | to attach them to the start of each source file to most effectively
631 | state the exclusion of warranty; and each file should have at least
632 | the "copyright" line and a pointer to where the full notice is found.
633 |
634 |
635 | Copyright (C)
636 |
637 | This program is free software: you can redistribute it and/or modify
638 | it under the terms of the GNU General Public License as published by
639 | the Free Software Foundation, either version 3 of the License, or
640 | (at your option) any later version.
641 |
642 | This program is distributed in the hope that it will be useful,
643 | but WITHOUT ANY WARRANTY; without even the implied warranty of
644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645 | GNU General Public License for more details.
646 |
647 | You should have received a copy of the GNU General Public License
648 | along with this program. If not, see .
649 |
650 | Also add information on how to contact you by electronic and paper mail.
651 |
652 | If the program does terminal interaction, make it output a short
653 | notice like this when it starts in an interactive mode:
654 |
655 | Copyright (C)
656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657 | This is free software, and you are welcome to redistribute it
658 | under certain conditions; type `show c' for details.
659 |
660 | The hypothetical commands `show w' and `show c' should show the appropriate
661 | parts of the General Public License. Of course, your program's commands
662 | might be different; for a GUI interface, you would use an "about box".
663 |
664 | You should also get your employer (if you work as a programmer) or school,
665 | if any, to sign a "copyright disclaimer" for the program, if necessary.
666 | For more information on this, and how to apply and follow the GNU GPL, see
667 | .
668 |
669 | The GNU General Public License does not permit incorporating your program
670 | into proprietary programs. If your program is a subroutine library, you
671 | may consider it more useful to permit linking proprietary applications with
672 | the library. If this is what you want to do, use the GNU Lesser General
673 | Public License instead of this License. But first, please read
674 | .
675 |
--------------------------------------------------------------------------------
/feature_engineering.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": [
9 | "import numpy as np\n",
10 | "import pandas as pd\n",
11 | "from scipy.stats import pearsonr\n",
12 | "from sklearn.tree import DecisionTreeClassifier\n",
13 | "from sklearn.feature_selection import chi2, mutual_info_classif, RFE, SelectFromModel, SelectKBest, VarianceThreshold\n",
14 | "from sklearn.linear_model import LogisticRegression\n",
15 | "import warnings"
16 | ]
17 | },
18 | {
19 | "cell_type": "code",
20 | "execution_count": 2,
21 | "metadata": {},
22 | "outputs": [],
23 | "source": [
24 | "pd.set_option('display.max_columns', None)\n",
25 | "pd.options.mode.use_inf_as_na = True\n",
26 | "warnings.filterwarnings('ignore')"
27 | ]
28 | },
29 | {
30 | "cell_type": "code",
31 | "execution_count": 3,
32 | "metadata": {},
33 | "outputs": [],
34 | "source": [
35 | "data = pd.read_csv('G:\\IDS2018\\datasets\\Thursday-15-02-2018_TrafficForML_CICFlowMeter.csv')"
36 | ]
37 | },
38 | {
39 | "cell_type": "markdown",
40 | "metadata": {},
41 | "source": [
42 | "# 数据预处理"
43 | ]
44 | },
45 | {
46 | "cell_type": "code",
47 | "execution_count": 4,
48 | "metadata": {},
49 | "outputs": [],
50 | "source": [
51 | "numerical_fea = list(data.select_dtypes(exclude=['object']).columns)\n",
52 | "category_fea = list(filter(lambda x: x not in numerical_fea, list(data.columns)))"
53 | ]
54 | },
55 | {
56 | "cell_type": "code",
57 | "execution_count": 5,
58 | "metadata": {},
59 | "outputs": [],
60 | "source": [
61 | "def get_numerical_serial_fea(data, feas):\n",
62 | " numerical_serial_fea = []\n",
63 | " numerical_noserial_fea = []\n",
64 | " for fea in feas:\n",
65 | " temp = data[fea].nunique()\n",
66 | " if temp <= 10:\n",
67 | " numerical_noserial_fea.append(fea)\n",
68 | " else:\n",
69 | " numerical_serial_fea.append(fea)\n",
70 | " return numerical_serial_fea, numerical_noserial_fea\n",
71 | "numerical_serial_fea, numerical_noserial_fea = get_numerical_serial_fea(data, numerical_fea)"
72 | ]
73 | },
74 | {
75 | "cell_type": "code",
76 | "execution_count": 36,
77 | "metadata": {},
78 | "outputs": [
79 | {
80 | "data": {
81 | "text/plain": [
82 | "{'Dst Port': 0,\n",
83 | " 'Protocol': 0,\n",
84 | " 'Timestamp': 0,\n",
85 | " 'Flow Duration': 0,\n",
86 | " 'Tot Fwd Pkts': 0,\n",
87 | " 'Tot Bwd Pkts': 0,\n",
88 | " 'TotLen Fwd Pkts': 0,\n",
89 | " 'TotLen Bwd Pkts': 0,\n",
90 | " 'Fwd Pkt Len Max': 0,\n",
91 | " 'Fwd Pkt Len Min': 0,\n",
92 | " 'Fwd Pkt Len Mean': 0,\n",
93 | " 'Fwd Pkt Len Std': 0,\n",
94 | " 'Bwd Pkt Len Max': 0,\n",
95 | " 'Bwd Pkt Len Min': 0,\n",
96 | " 'Bwd Pkt Len Mean': 0,\n",
97 | " 'Bwd Pkt Len Std': 0,\n",
98 | " 'Flow Byts/s': 8027,\n",
99 | " 'Flow Pkts/s': 8027,\n",
100 | " 'Flow IAT Mean': 0,\n",
101 | " 'Flow IAT Std': 0,\n",
102 | " 'Flow IAT Max': 0,\n",
103 | " 'Flow IAT Min': 0,\n",
104 | " 'Fwd IAT Tot': 0,\n",
105 | " 'Fwd IAT Mean': 0,\n",
106 | " 'Fwd IAT Std': 0,\n",
107 | " 'Fwd IAT Max': 0,\n",
108 | " 'Fwd IAT Min': 0,\n",
109 | " 'Bwd IAT Tot': 0,\n",
110 | " 'Bwd IAT Mean': 0,\n",
111 | " 'Bwd IAT Std': 0,\n",
112 | " 'Bwd IAT Max': 0,\n",
113 | " 'Bwd IAT Min': 0,\n",
114 | " 'Fwd PSH Flags': 0,\n",
115 | " 'Bwd PSH Flags': 0,\n",
116 | " 'Fwd URG Flags': 0,\n",
117 | " 'Bwd URG Flags': 0,\n",
118 | " 'Fwd Header Len': 0,\n",
119 | " 'Bwd Header Len': 0,\n",
120 | " 'Fwd Pkts/s': 0,\n",
121 | " 'Bwd Pkts/s': 0,\n",
122 | " 'Pkt Len Min': 0,\n",
123 | " 'Pkt Len Max': 0,\n",
124 | " 'Pkt Len Mean': 0,\n",
125 | " 'Pkt Len Std': 0,\n",
126 | " 'Pkt Len Var': 0,\n",
127 | " 'FIN Flag Cnt': 0,\n",
128 | " 'SYN Flag Cnt': 0,\n",
129 | " 'RST Flag Cnt': 0,\n",
130 | " 'PSH Flag Cnt': 0,\n",
131 | " 'ACK Flag Cnt': 0,\n",
132 | " 'URG Flag Cnt': 0,\n",
133 | " 'CWE Flag Count': 0,\n",
134 | " 'ECE Flag Cnt': 0,\n",
135 | " 'Down/Up Ratio': 0,\n",
136 | " 'Pkt Size Avg': 0,\n",
137 | " 'Fwd Seg Size Avg': 0,\n",
138 | " 'Bwd Seg Size Avg': 0,\n",
139 | " 'Fwd Byts/b Avg': 0,\n",
140 | " 'Fwd Pkts/b Avg': 0,\n",
141 | " 'Fwd Blk Rate Avg': 0,\n",
142 | " 'Bwd Byts/b Avg': 0,\n",
143 | " 'Bwd Pkts/b Avg': 0,\n",
144 | " 'Bwd Blk Rate Avg': 0,\n",
145 | " 'Subflow Fwd Pkts': 0,\n",
146 | " 'Subflow Fwd Byts': 0,\n",
147 | " 'Subflow Bwd Pkts': 0,\n",
148 | " 'Subflow Bwd Byts': 0,\n",
149 | " 'Init Fwd Win Byts': 0,\n",
150 | " 'Init Bwd Win Byts': 0,\n",
151 | " 'Fwd Act Data Pkts': 0,\n",
152 | " 'Fwd Seg Size Min': 0,\n",
153 | " 'Active Mean': 0,\n",
154 | " 'Active Std': 0,\n",
155 | " 'Active Max': 0,\n",
156 | " 'Active Min': 0,\n",
157 | " 'Idle Mean': 0,\n",
158 | " 'Idle Std': 0,\n",
159 | " 'Idle Max': 0,\n",
160 | " 'Idle Min': 0,\n",
161 | " 'Label': 0}"
162 | ]
163 | },
164 | "execution_count": 36,
165 | "metadata": {},
166 | "output_type": "execute_result"
167 | }
168 | ],
169 | "source": [
170 | "data.isnull().sum().to_dict()"
171 | ]
172 | },
173 | {
174 | "cell_type": "code",
175 | "execution_count": 6,
176 | "metadata": {},
177 | "outputs": [],
178 | "source": [
179 | "data[numerical_serial_fea] = data[numerical_serial_fea].fillna(data[numerical_serial_fea].mean())"
180 | ]
181 | },
182 | {
183 | "cell_type": "code",
184 | "execution_count": 9,
185 | "metadata": {},
186 | "outputs": [
187 | {
188 | "data": {
189 | "text/plain": [
190 | "{'Dst Port': 0,\n",
191 | " 'Protocol': 0,\n",
192 | " 'Timestamp': 0,\n",
193 | " 'Flow Duration': 0,\n",
194 | " 'Tot Fwd Pkts': 0,\n",
195 | " 'Tot Bwd Pkts': 0,\n",
196 | " 'TotLen Fwd Pkts': 0,\n",
197 | " 'TotLen Bwd Pkts': 0,\n",
198 | " 'Fwd Pkt Len Max': 0,\n",
199 | " 'Fwd Pkt Len Min': 0,\n",
200 | " 'Fwd Pkt Len Mean': 0,\n",
201 | " 'Fwd Pkt Len Std': 0,\n",
202 | " 'Bwd Pkt Len Max': 0,\n",
203 | " 'Bwd Pkt Len Min': 0,\n",
204 | " 'Bwd Pkt Len Mean': 0,\n",
205 | " 'Bwd Pkt Len Std': 0,\n",
206 | " 'Flow Byts/s': 0,\n",
207 | " 'Flow Pkts/s': 0,\n",
208 | " 'Flow IAT Mean': 0,\n",
209 | " 'Flow IAT Std': 0,\n",
210 | " 'Flow IAT Max': 0,\n",
211 | " 'Flow IAT Min': 0,\n",
212 | " 'Fwd IAT Tot': 0,\n",
213 | " 'Fwd IAT Mean': 0,\n",
214 | " 'Fwd IAT Std': 0,\n",
215 | " 'Fwd IAT Max': 0,\n",
216 | " 'Fwd IAT Min': 0,\n",
217 | " 'Bwd IAT Tot': 0,\n",
218 | " 'Bwd IAT Mean': 0,\n",
219 | " 'Bwd IAT Std': 0,\n",
220 | " 'Bwd IAT Max': 0,\n",
221 | " 'Bwd IAT Min': 0,\n",
222 | " 'Fwd PSH Flags': 0,\n",
223 | " 'Bwd PSH Flags': 0,\n",
224 | " 'Fwd URG Flags': 0,\n",
225 | " 'Bwd URG Flags': 0,\n",
226 | " 'Fwd Header Len': 0,\n",
227 | " 'Bwd Header Len': 0,\n",
228 | " 'Fwd Pkts/s': 0,\n",
229 | " 'Bwd Pkts/s': 0,\n",
230 | " 'Pkt Len Min': 0,\n",
231 | " 'Pkt Len Max': 0,\n",
232 | " 'Pkt Len Mean': 0,\n",
233 | " 'Pkt Len Std': 0,\n",
234 | " 'Pkt Len Var': 0,\n",
235 | " 'FIN Flag Cnt': 0,\n",
236 | " 'SYN Flag Cnt': 0,\n",
237 | " 'RST Flag Cnt': 0,\n",
238 | " 'PSH Flag Cnt': 0,\n",
239 | " 'ACK Flag Cnt': 0,\n",
240 | " 'URG Flag Cnt': 0,\n",
241 | " 'CWE Flag Count': 0,\n",
242 | " 'ECE Flag Cnt': 0,\n",
243 | " 'Down/Up Ratio': 0,\n",
244 | " 'Pkt Size Avg': 0,\n",
245 | " 'Fwd Seg Size Avg': 0,\n",
246 | " 'Bwd Seg Size Avg': 0,\n",
247 | " 'Fwd Byts/b Avg': 0,\n",
248 | " 'Fwd Pkts/b Avg': 0,\n",
249 | " 'Fwd Blk Rate Avg': 0,\n",
250 | " 'Bwd Byts/b Avg': 0,\n",
251 | " 'Bwd Pkts/b Avg': 0,\n",
252 | " 'Bwd Blk Rate Avg': 0,\n",
253 | " 'Subflow Fwd Pkts': 0,\n",
254 | " 'Subflow Fwd Byts': 0,\n",
255 | " 'Subflow Bwd Pkts': 0,\n",
256 | " 'Subflow Bwd Byts': 0,\n",
257 | " 'Init Fwd Win Byts': 0,\n",
258 | " 'Init Bwd Win Byts': 0,\n",
259 | " 'Fwd Act Data Pkts': 0,\n",
260 | " 'Fwd Seg Size Min': 0,\n",
261 | " 'Active Mean': 0,\n",
262 | " 'Active Std': 0,\n",
263 | " 'Active Max': 0,\n",
264 | " 'Active Min': 0,\n",
265 | " 'Idle Mean': 0,\n",
266 | " 'Idle Std': 0,\n",
267 | " 'Idle Max': 0,\n",
268 | " 'Idle Min': 0,\n",
269 | " 'Label': 0}"
270 | ]
271 | },
272 | "execution_count": 9,
273 | "metadata": {},
274 | "output_type": "execute_result"
275 | }
276 | ],
277 | "source": [
278 | "data.isnull().sum().to_dict()"
279 | ]
280 | },
281 | {
282 | "cell_type": "code",
283 | "execution_count": 7,
284 | "metadata": {},
285 | "outputs": [],
286 | "source": [
287 | "data['Timestamp'] = pd.to_datetime(data['Timestamp'],format='%d/%m/%Y %H:%M:%S')"
288 | ]
289 | },
290 | {
291 | "cell_type": "code",
292 | "execution_count": 7,
293 | "metadata": {},
294 | "outputs": [],
295 | "source": [
296 | "data['Label'].replace(to_replace='Benign', value=0, inplace=True)\n",
297 | "data['Label'].replace(to_replace='DoS attacks-GoldenEye', value=1, inplace=True)\n",
298 | "data['Label'].replace(to_replace='DoS attacks-Slowloris', value=1, inplace=True)"
299 | ]
300 | },
301 | {
302 | "cell_type": "markdown",
303 | "metadata": {},
304 | "source": [
305 | "# 异常值处理"
306 | ]
307 | },
308 | {
309 | "cell_type": "code",
310 | "execution_count": 10,
311 | "metadata": {},
312 | "outputs": [],
313 | "source": [
314 | "def find_outliers_by_3segama(data, fea):\n",
315 | " data_std = np.std(data[fea])\n",
316 | " data_mean = np.mean(data[fea])\n",
317 | " outliers_cut_off = 3 * data_std\n",
318 | " lower_rule = data_mean - outliers_cut_off\n",
319 | " upper_rule = data_mean + outliers_cut_off\n",
320 | " data[fea+'_outliers'] = data[fea].apply(lambda x: str('异常值') if x > upper_rule or x < lower_rule else '正常值')\n",
321 | " return data"
322 | ]
323 | },
324 | {
325 | "cell_type": "code",
326 | "execution_count": 27,
327 | "metadata": {},
328 | "outputs": [
329 | {
330 | "name": "stdout",
331 | "output_type": "stream",
332 | "text": [
333 | "正常值 1039789\n",
334 | "异常值 8786\n",
335 | "Name: Dst Port_outliers, dtype: int64\n",
336 | "Dst Port_outliers\n",
337 | "异常值 0\n",
338 | "正常值 52498\n",
339 | "Name: Label, dtype: int64\n",
340 | "**********\n",
341 | "正常值 991764\n",
342 | "异常值 56811\n",
343 | "Name: Flow Duration_outliers, dtype: int64\n",
344 | "Flow Duration_outliers\n",
345 | "异常值 280\n",
346 | "正常值 52218\n",
347 | "Name: Label, dtype: int64\n",
348 | "**********\n",
349 | "正常值 1046745\n",
350 | "异常值 1830\n",
351 | "Name: Tot Fwd Pkts_outliers, dtype: int64\n",
352 | "Tot Fwd Pkts_outliers\n",
353 | "异常值 0\n",
354 | "正常值 52498\n",
355 | "Name: Label, dtype: int64\n",
356 | "**********\n",
357 | "正常值 1046952\n",
358 | "异常值 1623\n",
359 | "Name: Tot Bwd Pkts_outliers, dtype: int64\n",
360 | "Tot Bwd Pkts_outliers\n",
361 | "异常值 0\n",
362 | "正常值 52498\n",
363 | "Name: Label, dtype: int64\n",
364 | "**********\n",
365 | "正常值 1048549\n",
366 | "异常值 26\n",
367 | "Name: TotLen Fwd Pkts_outliers, dtype: int64\n",
368 | "TotLen Fwd Pkts_outliers\n",
369 | "异常值 0\n",
370 | "正常值 52498\n",
371 | "Name: Label, dtype: int64\n",
372 | "**********\n",
373 | "正常值 1047070\n",
374 | "异常值 1505\n",
375 | "Name: TotLen Bwd Pkts_outliers, dtype: int64\n",
376 | "TotLen Bwd Pkts_outliers\n",
377 | "异常值 0\n",
378 | "正常值 52498\n",
379 | "Name: Label, dtype: int64\n",
380 | "**********\n",
381 | "正常值 1038021\n",
382 | "异常值 10554\n",
383 | "Name: Fwd Pkt Len Max_outliers, dtype: int64\n",
384 | "Fwd Pkt Len Max_outliers\n",
385 | "异常值 0\n",
386 | "正常值 52498\n",
387 | "Name: Label, dtype: int64\n",
388 | "**********\n",
389 | "正常值 1045594\n",
390 | "异常值 2981\n",
391 | "Name: Fwd Pkt Len Min_outliers, dtype: int64\n",
392 | "Fwd Pkt Len Min_outliers\n",
393 | "异常值 98\n",
394 | "正常值 52400\n",
395 | "Name: Label, dtype: int64\n",
396 | "**********\n",
397 | "正常值 1039579\n",
398 | "异常值 8996\n",
399 | "Name: Fwd Pkt Len Mean_outliers, dtype: int64\n",
400 | "Fwd Pkt Len Mean_outliers\n",
401 | "异常值 1178\n",
402 | "正常值 51320\n",
403 | "Name: Label, dtype: int64\n",
404 | "**********\n",
405 | "正常值 1037266\n",
406 | "异常值 11309\n",
407 | "Name: Fwd Pkt Len Std_outliers, dtype: int64\n",
408 | "Fwd Pkt Len Std_outliers\n",
409 | "异常值 634\n",
410 | "正常值 51864\n",
411 | "Name: Label, dtype: int64\n",
412 | "**********\n",
413 | "正常值 1048568\n",
414 | "异常值 7\n",
415 | "Name: Bwd Pkt Len Max_outliers, dtype: int64\n",
416 | "Bwd Pkt Len Max_outliers\n",
417 | "异常值 0\n",
418 | "正常值 52498\n",
419 | "Name: Label, dtype: int64\n",
420 | "**********\n",
421 | "正常值 1033705\n",
422 | "异常值 14870\n",
423 | "Name: Bwd Pkt Len Min_outliers, dtype: int64\n",
424 | "Bwd Pkt Len Min_outliers\n",
425 | "异常值 0\n",
426 | "正常值 52498\n",
427 | "Name: Label, dtype: int64\n",
428 | "**********\n",
429 | "正常值 1022827\n",
430 | "异常值 25748\n",
431 | "Name: Bwd Pkt Len Mean_outliers, dtype: int64\n",
432 | "Bwd Pkt Len Mean_outliers\n",
433 | "异常值 0\n",
434 | "正常值 52498\n",
435 | "Name: Label, dtype: int64\n",
436 | "**********\n",
437 | "正常值 1047631\n",
438 | "异常值 944\n",
439 | "Name: Bwd Pkt Len Std_outliers, dtype: int64\n",
440 | "Bwd Pkt Len Std_outliers\n",
441 | "异常值 0\n",
442 | "正常值 52498\n",
443 | "Name: Label, dtype: int64\n",
444 | "**********\n",
445 | "正常值 1043268\n",
446 | "异常值 5307\n",
447 | "Name: Flow Byts/s_outliers, dtype: int64\n",
448 | "Flow Byts/s_outliers\n",
449 | "异常值 4\n",
450 | "正常值 52494\n",
451 | "Name: Label, dtype: int64\n",
452 | "**********\n",
453 | "正常值 1031972\n",
454 | "异常值 16603\n",
455 | "Name: Flow Pkts/s_outliers, dtype: int64\n",
456 | "Flow Pkts/s_outliers\n",
457 | "异常值 458\n",
458 | "正常值 52040\n",
459 | "Name: Label, dtype: int64\n",
460 | "**********\n",
461 | "正常值 1004984\n",
462 | "异常值 43591\n",
463 | "Name: Flow IAT Mean_outliers, dtype: int64\n",
464 | "Flow IAT Mean_outliers\n",
465 | "异常值 3115\n",
466 | "正常值 49383\n",
467 | "Name: Label, dtype: int64\n",
468 | "**********\n",
469 | "正常值 1033696\n",
470 | "异常值 14879\n",
471 | "Name: Flow IAT Std_outliers, dtype: int64\n",
472 | "Flow IAT Std_outliers\n",
473 | "异常值 3698\n",
474 | "正常值 48800\n",
475 | "Name: Label, dtype: int64\n",
476 | "**********\n",
477 | "正常值 1021705\n",
478 | "异常值 26870\n",
479 | "Name: Flow IAT Max_outliers, dtype: int64\n",
480 | "Flow IAT Max_outliers\n",
481 | "异常值 3778\n",
482 | "正常值 48720\n",
483 | "Name: Label, dtype: int64\n",
484 | "**********\n",
485 | "正常值 1006778\n",
486 | "异常值 41797\n",
487 | "Name: Flow IAT Min_outliers, dtype: int64\n",
488 | "Flow IAT Min_outliers\n",
489 | "异常值 1862\n",
490 | "正常值 50636\n",
491 | "Name: Label, dtype: int64\n",
492 | "**********\n",
493 | "正常值 991938\n",
494 | "异常值 56637\n",
495 | "Name: Fwd IAT Tot_outliers, dtype: int64\n",
496 | "Fwd IAT Tot_outliers\n",
497 | "异常值 281\n",
498 | "正常值 52217\n",
499 | "Name: Label, dtype: int64\n",
500 | "**********\n",
501 | "正常值 1002872\n",
502 | "异常值 45703\n",
503 | "Name: Fwd IAT Mean_outliers, dtype: int64\n",
504 | "Fwd IAT Mean_outliers\n",
505 | "异常值 4781\n",
506 | "正常值 47717\n",
507 | "Name: Label, dtype: int64\n",
508 | "**********\n",
509 | "正常值 1010889\n",
510 | "异常值 37686\n",
511 | "Name: Fwd IAT Std_outliers, dtype: int64\n",
512 | "Fwd IAT Std_outliers\n",
513 | "异常值 239\n",
514 | "正常值 52259\n",
515 | "Name: Label, dtype: int64\n",
516 | "**********\n",
517 | "正常值 1004804\n",
518 | "异常值 43771\n",
519 | "Name: Fwd IAT Max_outliers, dtype: int64\n",
520 | "Fwd IAT Max_outliers\n",
521 | "异常值 3778\n",
522 | "正常值 48720\n",
523 | "Name: Label, dtype: int64\n",
524 | "**********\n",
525 | "正常值 1002826\n",
526 | "异常值 45749\n",
527 | "Name: Fwd IAT Min_outliers, dtype: int64\n",
528 | "Fwd IAT Min_outliers\n",
529 | "异常值 4902\n",
530 | "正常值 47596\n",
531 | "Name: Label, dtype: int64\n",
532 | "**********\n",
533 | "正常值 979526\n",
534 | "异常值 69049\n",
535 | "Name: Bwd IAT Tot_outliers, dtype: int64\n",
536 | "Bwd IAT Tot_outliers\n",
537 | "异常值 7142\n",
538 | "正常值 45356\n",
539 | "Name: Label, dtype: int64\n",
540 | "**********\n",
541 | "正常值 1035909\n",
542 | "异常值 12666\n",
543 | "Name: Bwd IAT Mean_outliers, dtype: int64\n",
544 | "Bwd IAT Mean_outliers\n",
545 | "异常值 7353\n",
546 | "正常值 45145\n",
547 | "Name: Label, dtype: int64\n",
548 | "**********\n",
549 | "正常值 1019297\n",
550 | "异常值 29278\n",
551 | "Name: Bwd IAT Std_outliers, dtype: int64\n",
552 | "Bwd IAT Std_outliers\n",
553 | "异常值 5001\n",
554 | "正常值 47497\n",
555 | "Name: Label, dtype: int64\n",
556 | "**********\n",
557 | "正常值 1007151\n",
558 | "异常值 41424\n",
559 | "Name: Bwd IAT Max_outliers, dtype: int64\n",
560 | "Bwd IAT Max_outliers\n",
561 | "异常值 7196\n",
562 | "正常值 45302\n",
563 | "Name: Label, dtype: int64\n",
564 | "**********\n",
565 | "正常值 1037488\n",
566 | "异常值 11087\n",
567 | "Name: Bwd IAT Min_outliers, dtype: int64\n",
568 | "Bwd IAT Min_outliers\n",
569 | "异常值 7150\n",
570 | "正常值 45348\n",
571 | "Name: Label, dtype: int64\n",
572 | "**********\n",
573 | "正常值 1046973\n",
574 | "异常值 1602\n",
575 | "Name: Fwd Header Len_outliers, dtype: int64\n",
576 | "Fwd Header Len_outliers\n",
577 | "异常值 0\n",
578 | "正常值 52498\n",
579 | "Name: Label, dtype: int64\n",
580 | "**********\n",
581 | "正常值 1046933\n",
582 | "异常值 1642\n",
583 | "Name: Bwd Header Len_outliers, dtype: int64\n",
584 | "Bwd Header Len_outliers\n",
585 | "异常值 0\n",
586 | "正常值 52498\n",
587 | "Name: Label, dtype: int64\n",
588 | "**********\n",
589 | "正常值 1032449\n",
590 | "异常值 16126\n",
591 | "Name: Fwd Pkts/s_outliers, dtype: int64\n",
592 | "Fwd Pkts/s_outliers\n",
593 | "异常值 55\n",
594 | "正常值 52443\n",
595 | "Name: Label, dtype: int64\n",
596 | "**********\n",
597 | "正常值 1046807\n",
598 | "异常值 1768\n",
599 | "Name: Bwd Pkts/s_outliers, dtype: int64\n",
600 | "Bwd Pkts/s_outliers\n",
601 | "异常值 754\n",
602 | "正常值 51744\n",
603 | "Name: Label, dtype: int64\n",
604 | "**********\n",
605 | "正常值 1044348\n",
606 | "异常值 4227\n",
607 | "Name: Pkt Len Min_outliers, dtype: int64\n",
608 | "Pkt Len Min_outliers\n",
609 | "异常值 0\n",
610 | "正常值 52498\n",
611 | "Name: Label, dtype: int64\n",
612 | "**********\n",
613 | "正常值 1048557\n",
614 | "异常值 18\n",
615 | "Name: Pkt Len Max_outliers, dtype: int64\n",
616 | "Pkt Len Max_outliers\n",
617 | "异常值 0\n",
618 | "正常值 52498\n",
619 | "Name: Label, dtype: int64\n",
620 | "**********\n",
621 | "正常值 1029538\n",
622 | "异常值 19037\n",
623 | "Name: Pkt Len Mean_outliers, dtype: int64\n",
624 | "Pkt Len Mean_outliers\n",
625 | "异常值 0\n",
626 | "正常值 52498\n",
627 | "Name: Label, dtype: int64\n",
628 | "**********\n",
629 | "正常值 1029158\n",
630 | "异常值 19417\n",
631 | "Name: Pkt Len Std_outliers, dtype: int64\n",
632 | "Pkt Len Std_outliers\n",
633 | "异常值 0\n",
634 | "正常值 52498\n",
635 | "Name: Label, dtype: int64\n",
636 | "**********\n",
637 | "正常值 1048554\n",
638 | "异常值 21\n",
639 | "Name: Pkt Len Var_outliers, dtype: int64\n",
640 | "Pkt Len Var_outliers\n",
641 | "异常值 0\n",
642 | "正常值 52498\n",
643 | "Name: Label, dtype: int64\n",
644 | "**********\n",
645 | "正常值 1044334\n",
646 | "异常值 4241\n",
647 | "Name: Down/Up Ratio_outliers, dtype: int64\n",
648 | "Down/Up Ratio_outliers\n",
649 | "异常值 0\n",
650 | "正常值 52498\n",
651 | "Name: Label, dtype: int64\n",
652 | "**********\n",
653 | "正常值 1028615\n",
654 | "异常值 19960\n",
655 | "Name: Pkt Size Avg_outliers, dtype: int64\n",
656 | "Pkt Size Avg_outliers\n",
657 | "异常值 2\n",
658 | "正常值 52496\n",
659 | "Name: Label, dtype: int64\n",
660 | "**********\n",
661 | "正常值 1039579\n",
662 | "异常值 8996\n",
663 | "Name: Fwd Seg Size Avg_outliers, dtype: int64\n",
664 | "Fwd Seg Size Avg_outliers\n",
665 | "异常值 1178\n",
666 | "正常值 51320\n",
667 | "Name: Label, dtype: int64\n",
668 | "**********\n",
669 | "正常值 1022827\n",
670 | "异常值 25748\n",
671 | "Name: Bwd Seg Size Avg_outliers, dtype: int64\n",
672 | "Bwd Seg Size Avg_outliers\n",
673 | "异常值 0\n",
674 | "正常值 52498\n",
675 | "Name: Label, dtype: int64\n",
676 | "**********\n",
677 | "正常值 1046745\n",
678 | "异常值 1830\n",
679 | "Name: Subflow Fwd Pkts_outliers, dtype: int64\n",
680 | "Subflow Fwd Pkts_outliers\n",
681 | "异常值 0\n",
682 | "正常值 52498\n",
683 | "Name: Label, dtype: int64\n",
684 | "**********\n",
685 | "正常值 1048549\n",
686 | "异常值 26\n",
687 | "Name: Subflow Fwd Byts_outliers, dtype: int64\n",
688 | "Subflow Fwd Byts_outliers\n",
689 | "异常值 0\n",
690 | "正常值 52498\n",
691 | "Name: Label, dtype: int64\n",
692 | "**********\n",
693 | "正常值 1046952\n",
694 | "异常值 1623\n",
695 | "Name: Subflow Bwd Pkts_outliers, dtype: int64\n",
696 | "Subflow Bwd Pkts_outliers\n",
697 | "异常值 0\n",
698 | "正常值 52498\n",
699 | "Name: Label, dtype: int64\n",
700 | "**********\n",
701 | "正常值 1047070\n",
702 | "异常值 1505\n",
703 | "Name: Subflow Bwd Byts_outliers, dtype: int64\n",
704 | "Subflow Bwd Byts_outliers\n",
705 | "异常值 0\n",
706 | "正常值 52498\n",
707 | "Name: Label, dtype: int64\n",
708 | "**********\n",
709 | "正常值 1025928\n",
710 | "异常值 22647\n",
711 | "Name: Init Fwd Win Byts_outliers, dtype: int64\n",
712 | "Init Fwd Win Byts_outliers\n",
713 | "异常值 0\n",
714 | "正常值 52498\n",
715 | "Name: Label, dtype: int64\n",
716 | "**********\n",
717 | "正常值 966856\n",
718 | "异常值 81719\n",
719 | "Name: Init Bwd Win Byts_outliers, dtype: int64\n",
720 | "Init Bwd Win Byts_outliers\n",
721 | "异常值 0\n",
722 | "正常值 52498\n",
723 | "Name: Label, dtype: int64\n",
724 | "**********\n",
725 | "正常值 1044073\n",
726 | "异常值 4502\n",
727 | "Name: Fwd Act Data Pkts_outliers, dtype: int64\n",
728 | "Fwd Act Data Pkts_outliers\n",
729 | "异常值 0\n",
730 | "正常值 52498\n",
731 | "Name: Label, dtype: int64\n",
732 | "**********\n",
733 | "正常值 1033732\n",
734 | "异常值 14843\n",
735 | "Name: Fwd Seg Size Min_outliers, dtype: int64\n",
736 | "Fwd Seg Size Min_outliers\n",
737 | "异常值 2232\n",
738 | "正常值 50266\n",
739 | "Name: Label, dtype: int64\n",
740 | "**********\n",
741 | "正常值 1034611\n",
742 | "异常值 13964\n",
743 | "Name: Active Mean_outliers, dtype: int64\n",
744 | "Active Mean_outliers\n",
745 | "异常值 5598\n",
746 | "正常值 46900\n",
747 | "Name: Label, dtype: int64\n",
748 | "**********\n"
749 | ]
750 | },
751 | {
752 | "name": "stdout",
753 | "output_type": "stream",
754 | "text": [
755 | "正常值 1034351\n",
756 | "异常值 14224\n",
757 | "Name: Active Std_outliers, dtype: int64\n",
758 | "Active Std_outliers\n",
759 | "异常值 4935\n",
760 | "正常值 47563\n",
761 | "Name: Label, dtype: int64\n",
762 | "**********\n",
763 | "正常值 1032734\n",
764 | "异常值 15841\n",
765 | "Name: Active Max_outliers, dtype: int64\n",
766 | "Active Max_outliers\n",
767 | "异常值 5557\n",
768 | "正常值 46941\n",
769 | "Name: Label, dtype: int64\n",
770 | "**********\n",
771 | "正常值 1035242\n",
772 | "异常值 13333\n",
773 | "Name: Active Min_outliers, dtype: int64\n",
774 | "Active Min_outliers\n",
775 | "异常值 5463\n",
776 | "正常值 47035\n",
777 | "Name: Label, dtype: int64\n",
778 | "**********\n",
779 | "正常值 996157\n",
780 | "异常值 52418\n",
781 | "Name: Idle Mean_outliers, dtype: int64\n",
782 | "Idle Mean_outliers\n",
783 | "异常值 4229\n",
784 | "正常值 48269\n",
785 | "Name: Label, dtype: int64\n",
786 | "**********\n",
787 | "正常值 1037445\n",
788 | "异常值 11130\n",
789 | "Name: Idle Std_outliers, dtype: int64\n",
790 | "Idle Std_outliers\n",
791 | "异常值 4788\n",
792 | "正常值 47710\n",
793 | "Name: Label, dtype: int64\n",
794 | "**********\n",
795 | "正常值 988121\n",
796 | "异常值 60454\n",
797 | "Name: Idle Max_outliers, dtype: int64\n",
798 | "Idle Max_outliers\n",
799 | "异常值 8686\n",
800 | "正常值 43812\n",
801 | "Name: Label, dtype: int64\n",
802 | "**********\n",
803 | "正常值 996490\n",
804 | "异常值 52085\n",
805 | "Name: Idle Min_outliers, dtype: int64\n",
806 | "Idle Min_outliers\n",
807 | "异常值 4277\n",
808 | "正常值 48221\n",
809 | "Name: Label, dtype: int64\n",
810 | "**********\n"
811 | ]
812 | }
813 | ],
814 | "source": [
815 | "for fea in numerical_serial_fea:\n",
816 | " data = find_outliers_by_3segama(data, fea)\n",
817 | " print(data[fea+'_outliers'].value_counts())\n",
818 | " print(data.groupby(fea+'_outliers')['Label'].sum())\n",
819 | " print('*'*10)"
820 | ]
821 | },
822 | {
823 | "cell_type": "markdown",
824 | "metadata": {},
825 | "source": [
826 | "# 特征选择"
827 | ]
828 | },
829 | {
830 | "cell_type": "code",
831 | "execution_count": 47,
832 | "metadata": {},
833 | "outputs": [
834 | {
835 | "name": "stdout",
836 | "output_type": "stream",
837 | "text": [
838 | "Selected: ['Dst Port' 'Flow Duration' 'Tot Fwd Pkts' 'Tot Bwd Pkts'\n",
839 | " 'TotLen Fwd Pkts' 'TotLen Bwd Pkts' 'Fwd Pkt Len Max' 'Fwd Pkt Len Min'\n",
840 | " 'Fwd Pkt Len Mean' 'Fwd Pkt Len Std' 'Bwd Pkt Len Max' 'Bwd Pkt Len Min'\n",
841 | " 'Bwd Pkt Len Mean' 'Bwd Pkt Len Std' 'Flow Byts/s' 'Flow Pkts/s'\n",
842 | " 'Flow IAT Mean' 'Flow IAT Std' 'Flow IAT Max' 'Flow IAT Min'\n",
843 | " 'Fwd IAT Tot' 'Fwd IAT Mean' 'Fwd IAT Std' 'Fwd IAT Max' 'Fwd IAT Min'\n",
844 | " 'Bwd IAT Tot' 'Bwd IAT Mean' 'Bwd IAT Std' 'Bwd IAT Max' 'Bwd IAT Min'\n",
845 | " 'Fwd Header Len' 'Bwd Header Len' 'Fwd Pkts/s' 'Bwd Pkts/s' 'Pkt Len Min'\n",
846 | " 'Pkt Len Max' 'Pkt Len Mean' 'Pkt Len Std' 'Pkt Len Var' 'Pkt Size Avg'\n",
847 | " 'Fwd Seg Size Avg' 'Bwd Seg Size Avg' 'Subflow Fwd Pkts'\n",
848 | " 'Subflow Fwd Byts' 'Subflow Bwd Pkts' 'Subflow Bwd Byts'\n",
849 | " 'Init Fwd Win Byts' 'Init Bwd Win Byts' 'Fwd Act Data Pkts'\n",
850 | " 'Fwd Seg Size Min' 'Active Mean' 'Active Std' 'Active Max' 'Active Min'\n",
851 | " 'Idle Mean' 'Idle Std' 'Idle Max' 'Idle Min']\n",
852 | "Deleted: ['Down/Up Ratio']\n"
853 | ]
854 | }
855 | ],
856 | "source": [
857 | "selector = VarianceThreshold(threshold=3)\n",
858 | "selector = selector.fit(data[numerical_serial_fea])\n",
859 | "features_mask = selector.get_support(indices=True)\n",
860 | "selected_features = np.array(numerical_serial_fea)[features_mask]\n",
861 | "print('Selected:', selected_features)\n",
862 | "print('Deleted: ', [fea for fea in numerical_serial_fea if fea not in selected_features])"
863 | ]
864 | },
865 | {
866 | "cell_type": "code",
867 | "execution_count": 12,
868 | "metadata": {},
869 | "outputs": [
870 | {
871 | "data": {
872 | "text/plain": [
873 | "[('Fwd Seg Size Min', (0.4827216248545034, 0.0)),\n",
874 | " ('Bwd IAT Mean', (0.30192251129739955, 0.0)),\n",
875 | " ('Init Fwd Win Byts', (0.2684559690822708, 0.0)),\n",
876 | " ('Bwd IAT Min', (0.2500177147030524, 0.0)),\n",
877 | " ('Flow IAT Std', (0.21858340497356774, 0.0)),\n",
878 | " ('Bwd IAT Max', (0.19606408350148533, 0.0)),\n",
879 | " ('Bwd IAT Std', (0.18719441138249784, 0.0)),\n",
880 | " ('Idle Max', (0.18100280839192964, 0.0)),\n",
881 | " ('Fwd Pkt Len Std', (0.16886516326958462, 0.0)),\n",
882 | " ('Idle Std', (0.15481787043716266, 0.0))]"
883 | ]
884 | },
885 | "execution_count": 12,
886 | "metadata": {},
887 | "output_type": "execute_result"
888 | }
889 | ],
890 | "source": [
891 | "pearsonr_result = []\n",
892 | "for fea in numerical_serial_fea:\n",
893 | " pearsonr_result.append((fea, pearsonr(data[fea], data['Label'])))\n",
894 | "sorted(pearsonr_result, key=lambda x: abs(x[1][0]), reverse=True)[:10]"
895 | ]
896 | },
897 | {
898 | "cell_type": "code",
899 | "execution_count": 21,
900 | "metadata": {},
901 | "outputs": [
902 | {
903 | "name": "stdout",
904 | "output_type": "stream",
905 | "text": [
906 | "Dst Port\n",
907 | "(array([3.99751145e+08]), array([0.]))\n",
908 | "Flow Duration\n",
909 | "(array([3.59172003e+11]), array([0.]))\n",
910 | "Tot Fwd Pkts\n",
911 | "(array([3778.26711379]), array([0.]))\n",
912 | "Tot Bwd Pkts\n",
913 | "(array([147047.64832782]), array([0.]))\n",
914 | "TotLen Fwd Pkts\n",
915 | "(array([634718.39574114]), array([0.]))\n",
916 | "TotLen Bwd Pkts\n",
917 | "(array([2.24665013e+08]), array([0.]))\n",
918 | "Fwd Pkt Len Max\n",
919 | "(array([3126399.65719183]), array([0.]))\n",
920 | "Fwd Pkt Len Min\n",
921 | "(array([672290.30465466]), array([0.]))\n",
922 | "Fwd Pkt Len Mean\n",
923 | "(array([1008178.14621648]), array([0.]))\n",
924 | "Fwd Pkt Len Std\n",
925 | "(array([4910010.25013736]), array([0.]))\n",
926 | "Bwd Pkt Len Max\n",
927 | "(array([2426276.39917122]), array([0.]))\n",
928 | "Bwd Pkt Len Min\n",
929 | "(array([1859688.16916162]), array([0.]))\n",
930 | "Bwd Pkt Len Mean\n",
931 | "(array([14682.06813255]), array([0.]))\n",
932 | "Bwd Pkt Len Std\n",
933 | "(array([6324182.09067248]), array([0.]))\n",
934 | "Flow Byts/s\n",
935 | "(array([1.5768512e+10]), array([0.]))\n",
936 | "Flow Pkts/s\n",
937 | "(array([1.00582909e+09]), array([0.]))\n",
938 | "Flow IAT Mean\n",
939 | "(array([2.96727475e+11]), array([0.]))\n",
940 | "Flow IAT Std\n",
941 | "(array([9.98169939e+11]), array([0.]))\n",
942 | "Flow IAT Max\n",
943 | "(array([1.02174605e+12]), array([0.]))\n",
944 | "Flow IAT Min\n",
945 | "(array([2.28890909e+10]), array([0.]))\n",
946 | "Fwd IAT Tot\n",
947 | "(array([2.86848641e+11]), array([0.]))\n",
948 | "Fwd IAT Mean\n",
949 | "(array([9.49019226e+11]), array([0.]))\n",
950 | "Fwd IAT Std\n",
951 | "(array([4.93833027e+10]), array([0.]))\n",
952 | "Fwd IAT Max\n",
953 | "(array([9.7532279e+11]), array([0.]))\n",
954 | "Fwd IAT Min\n",
955 | "(array([1.06993311e+12]), array([0.]))\n",
956 | "Bwd IAT Tot\n",
957 | "(array([3.67104733e+11]), array([0.]))\n",
958 | "Bwd IAT Mean\n",
959 | "(array([3.57822439e+12]), array([0.]))\n",
960 | "Bwd IAT Std\n",
961 | "(array([5.31186971e+11]), array([0.]))\n",
962 | "Bwd IAT Max\n",
963 | "(array([1.79577127e+12]), array([0.]))\n",
964 | "Bwd IAT Min\n",
965 | "(array([4.16347887e+12]), array([0.]))\n",
966 | "Fwd Header Len\n",
967 | "(array([1134722.69775687]), array([0.]))\n",
968 | "Bwd Header Len\n",
969 | "(array([1334952.53878541]), array([0.]))\n",
970 | "Fwd Pkts/s\n",
971 | "(array([1.3340166e+09]), array([0.]))\n",
972 | "Bwd Pkts/s\n",
973 | "(array([1.27108414e+08]), array([0.]))\n",
974 | "Pkt Len Min\n",
975 | "(array([763088.03979813]), array([0.]))\n",
976 | "Pkt Len Max\n",
977 | "(array([3235866.47097282]), array([0.]))\n",
978 | "Pkt Len Mean\n",
979 | "(array([79343.84160227]), array([0.]))\n",
980 | "Pkt Len Std\n",
981 | "(array([2061704.30901782]), array([0.]))\n",
982 | "Pkt Len Var\n",
983 | "(array([2.48367375e+08]), array([0.]))\n",
984 | "Down/Up Ratio\n",
985 | "(array([3734.48793754]), array([0.]))\n",
986 | "Pkt Size Avg\n",
987 | "(array([40190.97203183]), array([0.]))\n",
988 | "Fwd Seg Size Avg\n",
989 | "(array([1008178.14621648]), array([0.]))\n",
990 | "Bwd Seg Size Avg\n",
991 | "(array([14682.06813255]), array([0.]))\n",
992 | "Subflow Fwd Pkts\n",
993 | "(array([3778.26711379]), array([0.]))\n",
994 | "Subflow Fwd Byts\n",
995 | "(array([634718.39574114]), array([0.]))\n",
996 | "Subflow Bwd Pkts\n",
997 | "(array([147047.64832782]), array([0.]))\n",
998 | "Subflow Bwd Byts\n",
999 | "(array([2.24665013e+08]), array([0.]))\n",
1000 | "Fwd Act Data Pkts\n",
1001 | "(array([870.91484755]), array([2.06394786e-191]))\n",
1002 | "Fwd Seg Size Min\n",
1003 | "(array([823283.21674079]), array([0.]))\n",
1004 | "Active Mean\n",
1005 | "(array([1.42494306e+11]), array([0.]))\n",
1006 | "Active Std\n",
1007 | "(array([3.00722196e+10]), array([0.]))\n",
1008 | "Active Max\n",
1009 | "(array([1.15913032e+11]), array([0.]))\n",
1010 | "Active Min\n",
1011 | "(array([1.15899376e+11]), array([0.]))\n",
1012 | "Idle Mean\n",
1013 | "(array([1.11834743e+12]), array([0.]))\n",
1014 | "Idle Std\n",
1015 | "(array([5.2196894e+11]), array([0.]))\n",
1016 | "Idle Max\n",
1017 | "(array([1.64438117e+12]), array([0.]))\n",
1018 | "Idle Min\n",
1019 | "(array([8.75959539e+11]), array([0.]))\n"
1020 | ]
1021 | }
1022 | ],
1023 | "source": [
1024 | "# find out the features can not be applied by chi2\n",
1025 | "for fea in [fea for fea in numerical_serial_fea if fea not in ['Init Fwd Win Byts', 'Init Bwd Win Byts']]:\n",
1026 | " print(fea)\n",
1027 | " print(chi2(np.array(data[fea]).reshape(-1, 1), np.array(data['Label']).reshape(-1, 1)))"
1028 | ]
1029 | },
1030 | {
1031 | "cell_type": "code",
1032 | "execution_count": 49,
1033 | "metadata": {},
1034 | "outputs": [
1035 | {
1036 | "name": "stdout",
1037 | "output_type": "stream",
1038 | "text": [
1039 | "Selected: ['Bwd IAT Mean' 'Bwd IAT Max' 'Bwd IAT Min' 'Idle Mean' 'Idle Max']\n"
1040 | ]
1041 | }
1042 | ],
1043 | "source": [
1044 | "chi2_test_fea = [fea for fea in numerical_serial_fea if fea not in ['Init Fwd Win Byts', 'Init Bwd Win Byts']]\n",
1045 | "selector = SelectKBest(chi2, k=5)\n",
1046 | "selector = selector.fit(data[chi2_test_fea], data['Label'])\n",
1047 | "features_mask = selector.get_support(indices=True)\n",
1048 | "selected_features = np.array(chi2_test_fea)[features_mask]\n",
1049 | "print('Selected:', selected_features)"
1050 | ]
1051 | },
1052 | {
1053 | "cell_type": "code",
1054 | "execution_count": 50,
1055 | "metadata": {},
1056 | "outputs": [
1057 | {
1058 | "name": "stdout",
1059 | "output_type": "stream",
1060 | "text": [
1061 | "Selected: ['Flow IAT Max' 'Fwd Header Len' 'Pkt Len Max' 'Init Fwd Win Byts'\n",
1062 | " 'Fwd Seg Size Min']\n"
1063 | ]
1064 | }
1065 | ],
1066 | "source": [
1067 | "selector = SelectKBest(mutual_info_classif, k=5)\n",
1068 | "selector = selector.fit(data[numerical_serial_fea], data['Label'])\n",
1069 | "features_mask = selector.get_support(indices=True)\n",
1070 | "selected_features = np.array(numerical_serial_fea)[features_mask]\n",
1071 | "print('Selected:', selected_features)"
1072 | ]
1073 | },
1074 | {
1075 | "cell_type": "code",
1076 | "execution_count": 56,
1077 | "metadata": {},
1078 | "outputs": [
1079 | {
1080 | "name": "stdout",
1081 | "output_type": "stream",
1082 | "text": [
1083 | "Selected: ['Dst Port' 'Fwd Pkts/s' 'Down/Up Ratio' 'Init Fwd Win Byts'\n",
1084 | " 'Fwd Seg Size Min']\n"
1085 | ]
1086 | }
1087 | ],
1088 | "source": [
1089 | "features = [fea for fea in data.columns if fea not in ['Timestamp', 'Label']]\n",
1090 | "selector = RFE(DecisionTreeClassifier(), n_features_to_select=5, step=1)\n",
1091 | "selector = selector.fit(data[features], data['Label'])\n",
1092 | "features_mask = selector.get_support(indices=True)\n",
1093 | "selected_features = np.array(features)[features_mask]\n",
1094 | "print('Selected:', selected_features)"
1095 | ]
1096 | },
1097 | {
1098 | "cell_type": "code",
1099 | "execution_count": 52,
1100 | "metadata": {},
1101 | "outputs": [
1102 | {
1103 | "name": "stdout",
1104 | "output_type": "stream",
1105 | "text": [
1106 | "Selected: ['Dst Port' 'Flow Duration' 'Flow Byts/s' 'Flow Pkts/s' 'Flow IAT Max'\n",
1107 | " 'Fwd IAT Tot' 'Fwd IAT Mean' 'Fwd IAT Std' 'Fwd IAT Max' 'Fwd IAT Min'\n",
1108 | " 'Bwd IAT Tot' 'Bwd IAT Mean' 'Bwd IAT Std' 'Bwd IAT Max' 'Bwd IAT Min'\n",
1109 | " 'Fwd Pkts/s' 'Pkt Len Var' 'Idle Mean' 'Idle Std' 'Idle Max' 'Idle Min']\n"
1110 | ]
1111 | }
1112 | ],
1113 | "source": [
1114 | "selector = SelectFromModel(LogisticRegression(penalty='l2', C=10))\n",
1115 | "selector = selector.fit(data[features], data['Label'])\n",
1116 | "features_mask = selector.get_support(indices=True)\n",
1117 | "selected_features = np.array(features)[features_mask]\n",
1118 | "print('Selected:', selected_features)"
1119 | ]
1120 | },
1121 | {
1122 | "cell_type": "code",
1123 | "execution_count": 55,
1124 | "metadata": {},
1125 | "outputs": [
1126 | {
1127 | "name": "stdout",
1128 | "output_type": "stream",
1129 | "text": [
1130 | "Selected: ['Dst Port' 'Fwd Seg Size Min']\n"
1131 | ]
1132 | }
1133 | ],
1134 | "source": [
1135 | "selector = SelectFromModel(DecisionTreeClassifier())\n",
1136 | "selector = selector.fit(data[features], data['Label'])\n",
1137 | "features_mask = selector.get_support(indices=True)\n",
1138 | "selected_features = np.array(features)[features_mask]\n",
1139 | "print('Selected:', selected_features)"
1140 | ]
1141 | },
1142 | {
1143 | "cell_type": "code",
1144 | "execution_count": null,
1145 | "metadata": {},
1146 | "outputs": [],
1147 | "source": []
1148 | }
1149 | ],
1150 | "metadata": {
1151 | "kernelspec": {
1152 | "display_name": "Python 3",
1153 | "language": "python",
1154 | "name": "python3"
1155 | },
1156 | "language_info": {
1157 | "codemirror_mode": {
1158 | "name": "ipython",
1159 | "version": 3
1160 | },
1161 | "file_extension": ".py",
1162 | "mimetype": "text/x-python",
1163 | "name": "python",
1164 | "nbconvert_exporter": "python",
1165 | "pygments_lexer": "ipython3",
1166 | "version": "3.7.9"
1167 | }
1168 | },
1169 | "nbformat": 4,
1170 | "nbformat_minor": 4
1171 | }
1172 |
--------------------------------------------------------------------------------
/draw_pics.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": [
9 | "import matplotlib.pyplot as plt"
10 | ]
11 | },
12 | {
13 | "cell_type": "code",
14 | "execution_count": 2,
15 | "metadata": {},
16 | "outputs": [],
17 | "source": [
18 | "lgb_accuracy_score_list = [0.999980926495482, 0.9999856948716115, 0.9999666213670935, 0.999990463247741, 0.9999570846148345]\n",
19 | "lgb_f1_score_list = [0.9998095419483859, 0.9998571496595401, 0.9996667142789125, 0.9999047619047619, 0.9995716121662145]\n",
20 | "lgb_auc_score_list = [0.99999999856567, 0.9999999985656699, 0.9999999684475853, 0.9999999885263947, 0.9999999792040903]\n",
21 | "\n",
22 | "xgb_accuracy_score_list = [0.999961852990964, 0.999980926495482, 0.9999475478625754, 0.9999380111103163, 0.9999427794864459]\n",
23 | "xgb_f1_score_list = [0.9996189750428652, 0.9998095056672064, 0.999476165531692, 0.99938074596294, 0.9994285714285714]\n",
24 | "xgb_auc_score_list = [0.9999995013312458, 0.9999994998969156, 0.999999535318984, 0.9999995109375728, 0.9999994994639676]"
25 | ]
26 | },
27 | {
28 | "cell_type": "code",
29 | "execution_count": 3,
30 | "metadata": {},
31 | "outputs": [
32 | {
33 | "data": {
34 | "image/png": "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\n",
35 | "text/plain": [
36 | ""
37 | ]
38 | },
39 | "metadata": {
40 | "needs_background": "light"
41 | },
42 | "output_type": "display_data"
43 | }
44 | ],
45 | "source": [
46 | "plt.figure(figsize=(18, 4))\n",
47 | "plt.subplot(131)\n",
48 | "plt.plot([str(i) for i in range(5)], lgb_accuracy_score_list, label='LightGBM', marker='o')\n",
49 | "plt.plot([str(i) for i in range(5)], xgb_accuracy_score_list, label='XGBoost', marker='s')\n",
50 | "plt.ylim(0.9999, 1.0)\n",
51 | "plt.xlabel('$K^{th}$ Fold')\n",
52 | "plt.ylabel('Accuracy')\n",
53 | "plt.grid()\n",
54 | "plt.legend()\n",
55 | "plt.subplot(132)\n",
56 | "plt.plot([str(i) for i in range(5)], lgb_f1_score_list, label='LightGBM', marker='o')\n",
57 | "plt.plot([str(i) for i in range(5)], xgb_f1_score_list, label='XGBoost', marker='s')\n",
58 | "plt.ylim(0.999, 1.0)\n",
59 | "plt.xlabel('$K^{th}$ Fold')\n",
60 | "plt.ylabel('F1 Score')\n",
61 | "plt.grid()\n",
62 | "plt.legend()\n",
63 | "plt.subplot(133)\n",
64 | "plt.plot([str(i) for i in range(5)], lgb_auc_score_list, label='LightGBM', marker='o')\n",
65 | "plt.plot([str(i) for i in range(5)], xgb_auc_score_list, label='XGBoost', marker='s')\n",
66 | "plt.ylim(0.999999, 1.0)\n",
67 | "plt.xlabel('$K^{th}$ Fold')\n",
68 | "plt.ylabel('AUC')\n",
69 | "plt.grid()\n",
70 | "plt.legend()\n",
71 | "plt.savefig('./pics/acc_f1_auc_lgb_xgb.png', bbox_inches='tight')"
72 | ]
73 | },
74 | {
75 | "cell_type": "code",
76 | "execution_count": 69,
77 | "metadata": {},
78 | "outputs": [],
79 | "source": [
80 | "top_ten_important_features = [('Fwd_Seg_Size_Min', 9338911.301903933), ('Dst_Port', 1057550.6179607362), ('Fwd_Header_Len', 410228.37797785224), ('Init_Fwd_Win_Byts', 89286.21361017204), ('Flow_Byts/s', 77586.27008461952), ('Flow_IAT_Max', 55537.81665795727), ('Pkt_Len_Max', 45023.481026887894), ('Fwd_IAT_Min', 36902.22046112176), ('Fwd_Pkts/s', 17839.881527069956), ('Flow_Pkts/s', 17816.451269016834)]"
81 | ]
82 | },
83 | {
84 | "cell_type": "code",
85 | "execution_count": 70,
86 | "metadata": {},
87 | "outputs": [],
88 | "source": [
89 | "x = [fea[0] for fea in top_ten_important_features]\n",
90 | "y = [fea[1] for fea in top_ten_important_features]\n",
91 | "x.reverse()\n",
92 | "y.reverse()"
93 | ]
94 | },
95 | {
96 | "cell_type": "code",
97 | "execution_count": 72,
98 | "metadata": {},
99 | "outputs": [
100 | {
101 | "data": {
102 | "image/png": "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\n",
103 | "text/plain": [
104 | ""
105 | ]
106 | },
107 | "metadata": {
108 | "needs_background": "light"
109 | },
110 | "output_type": "display_data"
111 | }
112 | ],
113 | "source": [
114 | "plt.figure(figsize=(8, 6))\n",
115 | "plt.barh(x, y)\n",
116 | "plt.xlabel('Importance')\n",
117 | "plt.ylabel('Features')\n",
118 | "plt.grid()\n",
119 | "plt.savefig('./pics/feature_importance.png', bbox_inches='tight')"
120 | ]
121 | },
122 | {
123 | "cell_type": "code",
124 | "execution_count": null,
125 | "metadata": {},
126 | "outputs": [],
127 | "source": []
128 | }
129 | ],
130 | "metadata": {
131 | "kernelspec": {
132 | "display_name": "Python 3",
133 | "language": "python",
134 | "name": "python3"
135 | },
136 | "language_info": {
137 | "codemirror_mode": {
138 | "name": "ipython",
139 | "version": 3
140 | },
141 | "file_extension": ".py",
142 | "mimetype": "text/x-python",
143 | "name": "python",
144 | "nbconvert_exporter": "python",
145 | "pygments_lexer": "ipython3",
146 | "version": "3.7.9"
147 | }
148 | },
149 | "nbformat": 4,
150 | "nbformat_minor": 4
151 | }
152 |
--------------------------------------------------------------------------------