Je commence le machine learning avec python.
Quel que soit l'algorithme utilisé, il est essentiel de convertir des échantillons de données au format csv ou tsv en une matrice, j'ai donc étudié plusieurs méthodes.
Cette fois, nous utiliserons 100K MovieLens 100K Dataset de MovieLens Dataset, qui est considéré comme la référence la plus couramment utilisée pour le co-filtrage. ..
MovieLens Dataset
Pour plus d'informations sur Dataset, vous pouvez lire README, mais je pense que u.data sera le principal à utiliser.
Un tsv à 4 colonnes avec user_id, item_id, rating et timestamp.
196 242 3 881250949
186 302 3 891717742
22 377 1 878887116
244 51 2 880606923
166 346 1 886397596
298 474 4 884182806
...
Enfin, je souhaite convertir la note d'évaluation de l'élément j de l'utilisateur i en une matrice telle que R (i, j) = note.
with open('u.data', newline='') as f:
reader = csv.reader(f, delimiter='\t')
for row in reader:
print(row)
Si vous voulez juste le lire, le module csv suffit. Cependant, afin de déterminer la forme de la matrice R, il est nécessaire de trouver les valeurs maximales de user_id et item_id.
Utilisez le pandas: boîte à outils d'analyse de données Python puissante pour améliorer la gestion des données.
L'installation est pip install pandas, et la méthode pour trouver la valeur maximale pour chaque colonne de csv est la suivante.
>>> df = pd.read_csv('u.data', sep='\t', names=['user_id','item_id', 'rating', 'timestamp'])
>>> df.max()
user_id 943
item_id 1682
rating 5
timestamp 893286638
dtype: int64
Où df est un objet DataFrame et df.max () est un objet Series.
>>> type(df)
<class 'pandas.core.frame.DataFrame'>
>>> type(df.max())
<class 'pandas.core.series.Series'>
Pour accéder à la valeur maximale de chaque colonne, vous pouvez effectuer les opérations suivantes:
>>> df.max().ix['user_id']
943
>>> df.max().ix['item_id']
1682
Pour les articles de commentaires en japonais, http://oceanmarine.sakura.ne.jp/sphinx/group/group_pandas.html est facile à comprendre.
À ce stade, tout ce que vous avez à faire est de traiter sérieusement chaque élément de données.
import numpy as np
import pandas as pd
df = pd.read_csv('u.data', sep='\t', names=['user_id','item_id', 'rating', 'timestamp'])
shape = (df.max().ix['user_id'], df.max().ix['item_id'])
R = np.zeros(shape)
for i in df.index:
row = df.ix[i]
R[row['user_id'] -1 , row['item_id'] - 1] = row['rating']
>>> print(R)
[[ 5. 3. 4. ..., 0. 0. 0.]
[ 4. 0. 0. ..., 0. 0. 0.]
[ 0. 0. 0. ..., 0. 0. 0.]
...,
[ 5. 0. 0. ..., 0. 0. 0.]
[ 0. 0. 0. ..., 0. 0. 0.]
[ 0. 5. 0. ..., 0. 0. 0.]]
En général, c'est une matrice clairsemée (dans de nombreux films, le nombre qu'une personne évalue est limité), il semble donc préférable d'utiliser clairsemé.
import numpy as np
import pandas as pd
from scipy import sparse
df = pd.read_csv('u.data', sep='\t', names=['user_id','item_id', 'rating', 'timestamp'])
shape = (df.max().ix['user_id'] + 1, df.max().ix['item_id'] + 1)
R = sparse.lil_matrix(shape)
for i in df.index:
row = df.ix[i]
R[row['user_id'], row['item_id']] = row['rating']
>>> print(R.todense())
[[ 5. 3. 4. ..., 0. 0. 0.]
[ 4. 0. 0. ..., 0. 0. 0.]
[ 0. 0. 0. ..., 0. 0. 0.]
...,
[ 5. 0. 0. ..., 0. 0. 0.]
[ 0. 0. 0. ..., 0. 0. 0.]
[ 0. 5. 0. ..., 0. 0. 0.]]
c'est tout.
J'ai trouvé un problème où la première ligne et la première colonne étaient supplémentaires, alors je l'ai corrigé. Dans le premier projet, j'ai écrit ce qui suit. ..
shape = (df.max().ix['user_id'] + 1, df.max().ix['item_id'] + 1)
R = np.zeros(shape)
for i in df.index:
row = df.ix[i]
R[row['user_id'], row['item_id']] = row['rating']
Recommended Posts