機械学習の勉強をはじめてみる。
以前から気になっていた機械学習を勉強をはじめてみる。
事前知識
・pythonを利用すると比較的楽にお勉強ができる。 ・機械学習にもいろいろ種類がある、最新のはやりはDeepLearning(googleの画像解析etc) ・数学はちゃんと勉強しておけばよかった。→必要性を感じて初めてやる気が出た。
初歩から勉強したらどうしたらいいのだろう、とりあえず以下を参考に単純ベイズ法とやらを自分実装しながら、数式も理解していく。
環境
'''
$ python --version
Python 2.7.10
$ pip list | grep numpy numpy (1.10.1)
$ pip list | grep ipython ipython (4.0.0) ipython-genutils (0.1.0) '''
単純ベイズ
クラスを作成するところから勉強する。 fitで実際にの学習を行い、
# -*- coding:utf-8 -*- #URL: http://www.kamishima.net/mlmpyja/ import numpy as np import scipy as sp #import matplotlib.pyplot as plt import sklearn class NaiveBayes1(object): #todo: make class def __init__(self): self.pY_= None self.pXgY_ = None def fit(self,X,y): # constants # n_features:xの特徴種類,n_fvalues:xの値 n_samples = X.shape[0] n_features = X.shape[1] # n_classes:yのクラス ,n_fvalues:yの値 n_classes = 2 n_fvalues = 2 if n_samples != len(y): raise ValueError('Mismatched number of samples.') nY = np.zeros(n_classes, dtype=np.int) for i in xrange(n_samples): nY[y[i]] += 1 self.pY_ = np.empty(n_classes,dtype=np.float) for i in xrange(n_classes): self.pY_[i]= nY[i] / np.float(n_samples) nXY = np.zeros((n_features,n_fvalues,n_classes),dtype=np.int) for i in xrange(n_samples): for j in xrange(n_features): nXY[j,X[i,j],y[i]] +=1 self.pXgY_ = np.empty((n_features,n_fvalues,n_classes),dtype=np.float) for j in xrange(n_features): for xi in xrange(n_fvalues): for yi in xrange(n_classes): self.pXgY_[j,xi,yi]= nXY[j,xi,yi] / np.float(nY[yi]) def predict(self, X): # constants n_samples = X.shape[0] n_features = X.shape[1] # memory for return values y = np.empty(n_samples, dtype=np.int) for i, xi in enumerate(X): #calc predict logpXY = np.log(self.pY_) + \ np.sum(np.log(self.pXgY_[np.arange(n_features),xi,:]),axis=0) y[i] = np.argmax(logpXY) return y
実行してみる。
import numpy as np from nbayes1 import NaiveBayes1 data = np.genfromtxt('vote_filled.tsv',dtype=np.int) X = data[:, :-1] y = data[:, -1] clr = NaiveBayes1() clr.fit(X,y) pre_y = clr.predict(X[:10,:]) for i in xrange(10): print i,y[i],pre_y[i]
tsvファイルはここから取得します。 sample data
感想
・書くことで数式はなんとなく理解できたが、予想(predict)の公式どうやって導けるのかはよくわからん。やっぱ数学の知識は大事。
pandas備忘録
私が引っかかったポイントまとめ。
データ入力
read_csvの文字コード指定
基本的にread_csvでデータを読むことが多いので、read_csv利用時の注意事項。
csvデータのエンコード形式に注意、特にWindows+excelで作成したcsvファイルの読み込み時
df = pd.read_csv('hoge.csv',header=0,encoding='Shift_JIS')
"UnicodeDecodeError:"が発生した。これは文字コードが正しく指定できていないということ、 Shift_JISx0213 を指定するとうまく通った。
df = pd.read_csv('hoge.csv',header=0,encoding='Shift_JISx0213')
データ整形
正規表現によるSeirieからの文字抽出
下記のように","区切りで読み込めないようなファイルから、正規表現で必要な文字列だけを抽出してDataFrameにする方法
以下サンプルデータ、そのままread_csvするとカラム数が違うためエラーとなる。
value1=12333,value2(fuga,hoge),value3=fuga value1=111,value2(hoge),value3=fugahoge
読み取る場合はまず一列のデータとして読み取る。
In[2]: import pandas as pd In[3]: df = pd.read_csv('test.csv',header=None,sep='\t') In[4]: df Out[4]: 0 0 value1=12333,value2(fuga,hoge),value3=fuga 1 value1=111,value2(hoge),value3=fugahoge
正規表現を持ちいた分割にはSeries.str.extract()を利用して分割する。
In[5]: df[0].str.extract('value1=(?P<val1>\d+),value2\((?P<val2>[\w,]+)\),value3=(?P<val3>.*)') Out[5]: val1 val2 val3 0 12333 fuga,hoge fuga 1 111 hoge fugahoge
”()”の中身が実際に抽出する値、”?P<hoge>”の部分でカラム名を指定できる。 指定しない場合は頭から順番に番号が振られる。
また、抽出した値はobjectとして返されるので、int型等に適宜変更する必要がある。
リンク元
pythonによるスクレイピング
macの環境にBeautifulSoupをインストールします。
pip install BeautifulSoup4
…Successfully installed BeautifulSoup4-4.4.1
※古いバージョンをインストールしないよう注意
pip install BeautifulSoup
…Successfully installed BeautifulSoup-3.2.1
適当にCUIで試してみる。
from bs4 import BeautifulSoup
import urllib2,HTMLParser
page = urllib2.urlopen('hxxp://example.com')
soup=BeautifulSoup(page)
#a tag情報のみを取得
atag=soup.findAll('a')
pandasによるデータ解析作業メモ
pandasに関する作業メモ置き場。
・inputフォルダ直下のcsvファイルをresult(DataFrame)にまとめて呼び出す。
Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理
- 作者: Wes McKinney,小林儀匡,鈴木宏尚,瀬戸山雅人,滝口開資,野上大介
- 出版社/メーカー: オライリージャパン
- 発売日: 2013/12/26
- メディア: 大型本
- この商品を含むブログ (11件) を見る
phpMyFAQインストールメモ(CentOS6.6)
FAQシステム(phpMyFAQ)をインストールするのでメモ書き
構築環境
- CentOS6.6 x86-64
- VirtualBox
- php
- apache
- MySQL
- phpMyFAQ2.8.22
インストール
以下のサイトを参考にインストールします。
phpMyFAQ × CentOS7 (2) phpMyFAQのインストール – CLARA ONLINE techblog
事前準備編
yumのアップデート
yum update
wget,unzipは作業で使うのでインストール
必要なサーバインストール
phpモジュール追加
httpd起動
service httpd start
vim /etc/my.cnf
[mysqld]
character-set-server=utf8[client]
<p[mysqld_safe]
default-character-set=utf8
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
mysql起動
service mysqld start
自動起動設定を有効化
chkconfig httpd on
chkconfig mysqld on
ここまでで事前準備完了。
phpMyFAQインストール
phpMyFAQ - Downloads より最新版のzipを落とす。
html配下に移動
mv phpmyfaq/ /var/www/html/phpmyfaq
ディレクトリ作成(phpmyfaqで必要なディレクトリ)
mkdir /var/www/html/phpmyfaq/attachments
mkdir /var/www/html/phpmyfaq/data
mkdir /var/www/html/phpmyfaq/images
権限付与
chmod -R 775 /var/www/html/phpmyfaq/attachments
chmod -R 775 /var/www/html/phpmyfaq/data
chmod -R 775 /var/www/html/phpmyfaq/image
ディレクトリ所有者変更
サーバの設定
phpmysqlのDB作成
#mysqlのセキュリティ設定
mysql_secure_installation
#データベースに入る
mysql -u root -p
#DB作成
mysql> create database DB名 default character set utf8;
#ユーザ作成
mysql> grant all privileges on DB名.* to ユーザ名@localhost identified by 'パスワード';
#サーバに権限テーブルを再度読み込ませ、権限の変更を反映させる
mysql> flush privileges;
mysql> quit
httpd.conf設定(/etc/httpd/conf/httpd.conf)
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/var/www/html/phpmyfaq"
ドキュメントルートをphpmyfaqに設定
サービス再起動
service httpd restart
httpd を停止中: [ OK ]
httpd を起動中: Syntax error on line 292 of /etc/httpd/conf/httpd.conf:
DocumentRoot must be a directory
[失敗]service mysqld restart
mysqld を停止中: [ OK ]
mysqld を起動中: [ OK ]
DocumentRootの変更がうまくいかない、原因はSELinuxのようです。
#SELinuxを一時停止して検証
setenforce 0
servie httpd start
httpd を起動中: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName
[ OK ]
検証環境なのでとりあえずOKとします。
phpmyfaqのGUI設定
http://サーバ名/install/setup.php にアクセスします。
設定値に何をいれるかは以下のサイトを参考にさせていただきました。phpMyFAQ - 気の向くままに・・・ - Seesaa Wiki(ウィキ)
とりあえずこれで動いた。
レイアウトとかいけてないのでそのうち変えよう。
勉強環境
各種ツール類 使っているものetc
脆弱性体験、練習環境を提供
owaspbwa - OWASP Broken Web Applications Project - Google Project Hosting
脆弱性体験学習ツール AppGoat:IPA 独立行政法人 情報処理推進機構
日本語なのがありがたい、ヒントが豊富でわかりやすい。
診断関連
OWASP Zed Attack Proxy Project - OWASP
ターゲットのサイトを指定すれば
Penetration Testing Software | Metasploit
プロキシ
Webトラフィックのモニター改編のため、プロキシを利用。
Download Fiddler Web Debugging Tool for Free by Telerik
Fiddler利用方法
http://www.hebikuzure.com/fiddler/HajimetenoFiddler.pdf
参考サイト:
練習用脆弱Webアプリケーションの調査 - Web Application Security Memo
Snort動作確認編
前回 (Snortインストール編 - safari029’s blog)の続き。
動作確認作業
まずは適当なシグネチャを書きます。
$ vi /snort_test.conf
まずはホスト型IDSとして動作させます。シグネチャはとりあえずlocalに対するpingを検知する設定を作成。
alert icmp any any -> サーバのIP any (msg:”ICMP_detection”; sid:1000000;)
テストコマンドで確認してみます。
$ snort -T -c snort_test.conf~略~Snort successfully validated the configuration!Snort exiting
successfully がでてればOK、ちなみにNGのときはERRORとなるので適宜修正します。
あとlogファイル保管用のディレクトリ作っておきます。
(snort起動時にlog保管フォルダを指定できるのですが、指定しない場合は/var/log/snort/ 内に保存されるらしい)
$ sudo mkdir /var/log/snort
では早速起動。
# snort -D -c snort_test.conf
ログファイルを表示させながら外部から対象サーバにpingを打ってみると…
# tail -f /var/log/snort/alert [**] [1:1000000:0] ICMP_detection [**][Priority: 0]
11/14-23:51:38.973144 FROMのIP -> ホストのIP
ICMP TTL:119 TOS:0x0 ID:3020 IpLen:20 DgmLen:60
Type:8 Code:0 ID:61229 Seq:2 ECHO
無事検知されました、ちなみにシグネチャで検知されたパケットは同フォルダに「snort.log.数字」として保管されてます。こちらはWireSharkなどで確認することができます。
# ls -l /var/log/snort/
total 8
-rw-r--r-- 1 root root 788 Nov 14 23:52 alert
-rw-r--r-- 1 root root 384 Nov 14 23:52 snort.log.1415976580
最後にsnortはkillすることをお忘れなく。
参考
10分で出来る snort インストールと検知テスト at www.morihi-soc.net
ゼロから始めるLinuxセキュリティ(最終回):ネットワーク型IDS「Snort」のシグネチャ作成法 - @IT