第2回の練習問題の解答例¶

ここまで扱ってきたデータの英語学習者に関して部分的に評価値が付与されています。評価値は"../DATA02/nice_evaluation.csv"に保存されています。評価された作文は"../DATA02/NICE_NNS2"に保存されています。ここで学んだ同様の手順でこのデータを自動採点するシステムを構築し、交差検証を行いなさい。

In [1]:
# 使用するパッケージのimport
import os
import numpy as np
import pandas as pd
from nltk import word_tokenize,sent_tokenize
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix
from sklearn.neighbors import KNeighborsClassifier
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
In [2]:
# 文数、語数、Type token ratio、words per sentenceを算出する関数
def counters(X):
    s = len(sent_tokenize(X))
    tokens = word_tokenize(X)
    w = len(tokens)
    types = len(list(set(tokens)))
    ttr = types /w
    wps = w / s
    Y = [s,w,ttr,wps]
    return Y
In [3]:
# 対象とするテキストファイルの読み込み

fnames = os.listdir("../DATA02/NICE_NNS2/")

## ファイル名をソート ##
fnames.sort()

T = []

for i in fnames:
    f = open("../DATA02/NICE_NNS/"+i,"r")
    text = f.read()
    f.close()
    T.append(text)
In [4]:
# スコアの読み込み
E = pd.read_csv("../DATA02/nice_evaluation.csv",index_col=0)
Y = E["score"]
In [5]:
# 文数、語数、Type token ratio、words per sentenceの算出
X = []
for i in T:
    X.append(counters(i))
In [6]:
# 学習データとテストデータに分割
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2)
In [7]:
# knnで予測
# インスタンスの生成 (n_neighborsでkの値を指定)
knn = KNeighborsClassifier(n_neighbors=5)

# 学習
knn.fit(X_train,Y_train)

# 予測
Y_pred = knn.predict(X_test)

# 精度
knn.score(X_test,Y_test)
Out[7]:
0.6
In [8]:
# kの値を変化させてkを選ぶ

N = []
S = []

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2)

for i in range(1,31):
    knn = KNeighborsClassifier(n_neighbors=i)
    knn.fit(X_train,Y_train)
    score = knn.score(X_test,Y_test)
    N.append(i)
    S.append(score)

plt.xlabel("number_of_k")
plt.ylabel("accuracy")
plt.plot(N,S)
Out[8]:
[<matplotlib.lines.Line2D at 0x15a10ee80>]
No description has been provided for this image
In [9]:
# 交差検証

S = []
for i in range(100):
    X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3)
    knn = KNeighborsClassifier(n_neighbors=10)
    knn.fit(X_train,Y_train)
    S.append(knn.score(X_test,Y_test))
    
np.average(S)
Out[9]:
0.5345945945945946
In [10]:
# 混同行列

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3)

knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train,Y_train)
Y_pred = knn.predict(X_test)

cm = confusion_matrix(Y_test,Y_pred)

sns.heatmap(cm,annot=True,cmap="Blues")
Out[10]:
<AxesSubplot: >
No description has been provided for this image