NLP100は肩慣らしにちょうど良い

やりかけていたNLP100を終わらせた。
言語処理100本ノック

大学院に入学して最初の一週間で第7章まで進めて、機械学習の勉強をして5月の半ばに第8章までをやっていた。直近Word2vecを使おうと思っていてここ二日で第9,10章をやった。

コード → GitHub

終わってみて思うのはNLP100はPythonを書いたことがない人、機械学習のツールを使ったことがない人が練習するのにちょうど良いということだ。自分はNLP100を通じてPythonらしいお作法(リスト内包表記など)とともに、numpy, scipy, sklearn, matplotlibなどのデータ解析のライブラリの基本的な使い方を身につけることができた。
第8章の勉強にはCourseraのMachine Learningの課題が役に立った。
Coursera – Machine Learning

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
73. 学習
72で抽出した素性を用いて,ロジスティック回帰モデルを学習せよ.
"""

import numpy as np
import pandas as pd


def sigmoid(z):
    return 1 / (1 + np.exp(-z))


def compute(theta, X, y, lmda):
    m = y.size
    h = sigmoid(X.dot(theta))
    J = (1 / m) * np.sum(-1 * y * np.log(h) - (1 - y) * np.log(1 - h))
    penalty = (lmda / (2 * m)) * np.sum(np.power(theta[2:], 2))
    J += penalty
    grad = ((1 / m) * (h - y).T.dot(X)).T
    return J, grad


def logreg(X, y, iter=100):
    m, n = X.shape
    X = np.c_[np.ones((m, 1)), X]
    theta = np.zeros((n + 1, 1))
    lmda = 1.0
    eta = 0.1
    cost = 0
    for i in range(1, iter + 1):
        cost, grad = compute(theta, X, y, lmda)
        theta -= eta * grad
        # eta *= 0.9
        print("Iteration {:d}: cost={:f}".format(i, cost))
    return theta


if __name__ == "__main__":
    df = pd.read_csv("features.tsv", delimiter="\t", quoting=3)
    data = df.as_matrix()
    X = data[:, 1:]
    y = np.c_[data[:, 0]]
    weight = logreg(X, y, iter=500)
    new_df = pd.DataFrame(data=weight.T, columns=df.columns)
    new_df.rename(columns={"

より発展的な取り組みとして、ライブラリを使わず書く、Cythonを使って高速化させるなどをやってみても面白い。
ネット上で解説を見つけることができるし、NLP100は自分のような初学者が独学で進めるのに適していると思う。

LINEで送る
Pocket

コメントを残す

*