[PYTHON] Estimation de la valeur de capacité à l'aide de pyirt

Cet article est l'article du 20e jour du Calendrier de l'Avent Classi 2019.

Bonjour. Je m'appelle @yosuke_ohara et j'appartiens au département Data AI et je suis un data scientist. Classi est une entreprise qui fournit des services cloud qui soutiennent l'utilisation des TIC dans l'enseignement scolaire, mais dans le domaine de la science des données dans le domaine de l'éducation, la valeur des capacités des apprenants est souvent intéressante (appropriée si l'état de l'apprenant n'est pas compris). C'est naturel car cela ne mène pas à l'apprentissage). Par conséquent, je voudrais présenter une méthode appelée ** Théorie de la réponse à l'item **, qui est souvent utilisée dans l'estimation de la valeur des capacités.

table des matières

  1. Qu'est-ce que la théorie de la réponse aux items? (# Anchor1) 1-1. [Quel est le degré de discrimination](# anchor2) 1-2. [Quel est le niveau de difficulté](# anchor3)
  2. [Méthode d'estimation des paramètres](# anchor4)
  3. [Estimation des paramètres par la méthode périphérique la plus probable](# anchor5)
  4. [IRT Challenge](# anchor6)
  5. [Enfin](# anchor7)

Qu'est-ce que la théorie de la réponse aux éléments?

La théorie de la réponse aux éléments (IRT) est une méthode principalement utilisée pour estimer les valeurs de capacité à partir des résultats de tests, et est connue comme un test utilisant l'IRT par TOEIC. Le plus grand avantage de l'IRT est qu'il vous permet d'estimer les valeurs de capacité à travers les tests. La plupart des tests, tels que le test central, ont des possibilités limitées de passer le test, mais en utilisant l'IRT, les candidats qui ont passé différents tests peuvent également faire une évaluation commune. .. C'est donc un bon point pour les candidats de pouvoir passer le test au bon moment. Cependant, un processus appelé égalisation est nécessaire pour faire des estimations entre les tests. L'égalisation fait référence au processus d'alignement des résultats de différents tests sur une origine et une unité communes. Pour effectuer l'égalisation, il est nécessaire d'inclure un problème commun (appelé «problème d'ancrage») dans le test de comparaison, et la conception comprenant la manière de réaliser l'égalisation est appelée une conception de test. Je vais.

De plus, il se caractérise par la définition et l'estimation de paramètres non seulement pour les valeurs de capacité mais aussi pour les items (problèmes dans les tests). Plus précisément, un modèle logistique est supposé entre la valeur de la capacité et la probabilité de réponse correcte, et la forme des changements logistiques en fonction du paramètre de l'item pour exprimer la différence dans la probabilité de réponse correcte pour chaque question. Il existe des modèles à 1 paramètre à 4 paramètres, mais cette fois, nous prendrons le modèle logistique à 2 paramètres le plus couramment utilisé comme exemple.

p(θ) = \ \frac{1}{1+e^{-Da(θ-β)}}…(1)\\    

θ est la valeur de la capacité et p (θ) est la probabilité de réponse correcte. D est une constante d'intégration à 1 et les paramètres d'item les plus importants sont α (discrimination) et β (difficulté). Regardons concrètement comment la probabilité de réponse correcte change en fonction de α et β.

1-1 Quel est le degré de discrimination?

スクリーンショット 2019-12-20 18.38.21.png

Le degré de discrimination est un paramètre qui indique "dans quelle mesure la capacité du candidat peut être identifiée". En d'autres termes, c'est une valeur qui représente «la capacité à juger d'après l'exactitude du problème». En regardant le graphique ci-dessus, vous pouvez voir que la probabilité de réponse correcte augmente brusquement près du centre de la courbe (vert) avec un grand α. En d'autres termes, la gamme des valeurs de capacité où la probabilité de réponse correcte est d'environ 50% est étroite, et il est facile de juger que "si vous répondez correctement à cette question, la valeur de capacité est élevée". D'autre part, la courbe avec un petit α (bleu) est une courbe douce, et la plage de valeurs de capacité avec une probabilité de réponse correcte d'environ 50% est large. En d'autres termes, on ne peut pas dire que "même si vous répondez correctement à cette question, la valeur de la capacité est élevée".

1-2. Quel est le niveau de difficulté?

スクリーンショット 2019-12-20 18.37.44.png La difficulté, comme le mot l'indique, représente la difficulté d'un élément. On voit que plus β est grand, plus la courbe se déplace parallèlement dans la direction positive de l'axe x. En d'autres termes, en comparant la probabilité de réponse correcte pour chaque courbe avec la même capacité, on peut voir que plus le paramètre de difficulté est grand, plus la probabilité de réponse correcte est faible.

2. Méthode d'estimation des paramètres

J'ai essayé d'organiser les principales méthodes d'estimation (c'est une grande taille de grain car il n'y a pas de netteté si vous l'écrivez en détail comme l'extension Basian).

Méthode d'estimation           Aperçu
Méthode d'estimation la plus probable Méthode à utiliser lors de l'estimation de la valeur de la capacité et du paramètre d'élément et de l'autre
Méthode d'estimation du maximum de vraisemblance simultanée Méthode d'estimation simultanée des valeurs de capacité et des paramètres d'article. Estimer en répétant "(1) différenciation partielle et solution par valeur d'aptitude" et "(2) différenciation partielle et solution par paramètre d'item" pour la fonction de vraisemblance.
Méthode d'estimation la plus probable périphérique Méthode d'estimation par périphérie avec le paramètre de valeur de capacité et intégration et élimination lors de l'estimation du paramètre d'item dans l'estimation simultanée. Calculer à l'aide de l'algorithme EM

La plupart des estimations de probabilité sont une méthode simple de définition de la probabilité de réponse correcte par l'équation (1) et de création d'une fonction de vraisemblance, mais on part du principe que l'un des paramètres est requis. L'estimation simultanée est une méthode qui permet d'obtenir chaque paramètre à la fois, mais il existe un problème en ce que la quantité estimée de paramètres d'élément ne satisfait pas la cohérence. Par conséquent, il existe un inconvénient en ce que la précision n'augmente pas même si le nombre d'échantillons est augmenté afin d'améliorer la précision d'estimation. Afin de résoudre ce problème, la méthode de marginalisation du paramètre de valeur de capacité lors de l'estimation du paramètre d'item est la méthode d'estimation périphérique, et il semble que cette méthode soit actuellement l'estimation préférée. Cependant, comme la fonction de vraisemblance lorsqu'elle est marginalisée ne peut être résolue explicitement, elle est estimée par calcul numérique à l'aide de l'algorithme EM.

Estimation des paramètres par la méthode périphérique la plus probable

Quand j'ai examiné les paquets qui peuvent être analysés à l'aide de l'IRT, c'était pyirt pour Python et [ltm](https: //cran.r-project) pour R. .org / web / packages / ltm / ltm.pdf) et lazy.irtx semblent être utilisables. Cette fois, j'aimerais utiliser le package pyirt pour estimer les paramètres par la méthode du maximum de vraisemblance périphérique. L'ensemble de données utilise algebra_2005_2006 utilisé par KDDCUP. DataShop @ CMU a diverses données publiques liées à l'éducation et est recommandé. De plus, comme les données nécessaires sont téléchargées vers BigQuery, elles sont lues à l'aide de read_gbq de pandas.

%reload_ext autoreload
%autoreload 2
import itertools
import numpy as np
import pandas  as pd
from pandas.io import gbq
from pyirt import irt
#Module qui gère les requêtes qui extraient des données de BigQuery
import queries
from tqdm import tqdm

_train = pd.read_gbq(queries.train_agg(), PROJECT_ID, dialect='standard', location="asia-northeast1")
#Dans le cas de pyirt, unifiez aux noms de colonnes suivants[(user_id, item_id, ans_boolean)]Structure(Liste des taples)Besoin d'être
train = _train.rename(columns={
    "anon_student_id": "user_id",
    "question_unique_key": "item_id",
    "is_correct": "ans_boolean"
})

item_param, user_param = {}, {}
problem_hierarchies = train["problem_hierarchy"].unique()
#problem_Divisez les données pour chaque hiérarchie et estimez-les par la méthode du maximum de vraisemblance périphérique
for _problem_hierarchy in tqdm(problem_hierarchies, position=0):
    train_by_problem_hierarchy = train.query("problem_hierarchy == @_problem_hierarchy").drop("problem_hierarchy", axis=1)
    train_by_problem_hierarchy = train_by_problem_hierarchy[["user_id", "item_id", "ans_boolean"]].values
    #irt est une fonction d'estimation
    _item_param, _user_param = irt(train_by_problem_hierarchy)
    item_param.update(_item_param)
    user_param.update(_user_param)

La valeur de la capacité (user_param) et la valeur de l'élément (item_param) sont renvoyées au format dictionnaire comme ceci. スクリーンショット 2019-12-20 19.16.46.png スクリーンショット 2019-12-20 19.16.34.png

Je souhaite stocker les résultats dans BigQuery, je le convertis donc en cadre de données et l'envoie avec gbq.to_gbq.

user_param_df = pd.DataFrame(user_param.items(), columns=["anon_student_id", "theta"])
item_param_dict = []
for tmp_question_unique_key, param_dict in item_param.items():
    item_param_dict.append({
        "question_unique_key": tmp_question_unique_key,
        "alpha": param_dict["alpha"],
        "beta": param_dict["beta"],
        "c": param_dict["c"]
    })
item_param_df = pd.io.json.json_normalize(item_param_dict)

#Envoyer le résultat de l'estimation à BigQuery
gbq.to_gbq(item_param_df,'{}.item_param'.format(DATASET), project_id=PROJECT_ID, if_exists='append', location="asia-northeast1")
gbq.to_gbq(user_param_df,'{}.user_param'.format(DATASET), project_id=PROJECT_ID, if_exists='append', location="asia-northeast1")
スクリーンショット 2019-12-20 18.03.16.png

Si vous faites un diagramme de dispersion pour chaque problème avec le degré d'identification x difficulté, vous pouvez voir que le degré d'identification est estimé dans l'intervalle de 0 à 3 et le degré de difficulté est estimé dans l'intervalle de -3 à 3.

Défis IRT

L'IRT convient pour l'estimation dans des situations où la valeur de la capacité ne change pas, comme dans un test, mais l'estimation dans des situations de séries chronologiques (par exemple, lorsque la valeur de la capacité change de manière séquentielle en raison de l'apprentissage comme l'auto-apprentissage) Il y a un problème car il ne convient pas. Par conséquent, des extensions de séries temporelles ont été apportées, telles que l'introduction de paramètres de temps au degré de discrimination et la méthode de description des changements de valeurs de capacité dans un modèle d'espace d'états. De plus, une méthode appelée Knowledge Tracing est souvent utilisée comme méthode d'estimation des valeurs de capacité. Le suivi des connaissances est un modèle qui suppose un modèle de Markov caché dans la transition des valeurs de capacité, et est caractérisé en définissant la probabilité entre les transitions comme une probabilité conditionnelle et en estimant la valeur de capacité à partir de la probabilité conditionnelle. Je n'ai pas trouvé de package pour Knowledge Tracing sur pypi, mais un package appelé pyBKT (BKT… Bayesian Knowledge Tracing) est disponible sur Git, alors essayez-le. Je vais essayer.

finalement

Cette fois, j'ai principalement parlé de l'IRT, mais je pense que le domaine de l'estimation de la valeur des capacités est encore jeune et qu'il y a de la place pour renverser les méthodes dans d'autres domaines. J'estime qu'il est nécessaire de changer la méthode de formulation du problème et d'adopter une approche flexible sans être lié par la méthode existante. Si vous souhaitez en savoir plus sur l'estimation de la valeur des capacités, veuillez vous référer à la partie introductive de l'article ici qui a remporté le prix à l'EDM (Educational Data Mining) en 2019. Jetez un œil à ceci.

Demain, c'est @kitaharamikiya !!

Recommended Posts

Estimation de la valeur de capacité à l'aide de pyirt
Simulation d'estimation de trajectoire à l'aide de SLAM à base de graphes
Extraire des informations à l'aide de File :: Stat dans Ruby
Estimation de catégorie à l'aide de l'API de reconnaissance d'image de docomo