Ich beginne mit maschinellem Lernen mit Python.
Unabhängig vom verwendeten Algorithmus ist es wichtig, Beispieldaten im CSV- oder TsV-Format in eine Matrix zu konvertieren. Daher habe ich verschiedene Methoden untersucht.
Dieses Mal verwenden wir 100K MovieLens 100K-Datensatz des MovieLens-Datensatzes, der als der am häufigsten verwendete Benchmark für die Co-Filterung gilt. ..
MovieLens Dataset
Weitere Informationen zu Dataset finden Sie unter README. Ich denke jedoch, dass u.data die Hauptverwendung sein wird.
Ein 4-Spalten-Tsv mit Benutzer-ID, Element-ID, Bewertung und Zeitstempel.
196 242 3 881250949
186 302 3 891717742
22 377 1 878887116
244 51 2 880606923
166 346 1 886397596
298 474 4 884182806
...
Schließlich möchte ich die Bewertungsbewertung für Element j des Benutzers i in eine Matrix umwandeln, so dass R (i, j) = Bewertung ist.
with open('u.data', newline='') as f:
reader = csv.reader(f, delimiter='\t')
for row in reader:
print(row)
Wenn Sie es nur lesen möchten, reicht das CSV-Modul aus. Um jedoch die Form der Matrix R zu bestimmen, müssen die Maximalwerte von user_id und item_id ermittelt werden.
Verwenden Sie das pandas: leistungsstarke Python-Datenanalyse-Toolkit, um die Datenverarbeitung zu verbessern.
Die Installation ist pip install pandas, und die Methode zum Ermitteln des Maximalwerts für jede Spalte von csv lautet wie folgt.
>>> 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
Dabei ist df ein DataFrame-Objekt und df.max () ein Series-Objekt.
>>> type(df)
<class 'pandas.core.frame.DataFrame'>
>>> type(df.max())
<class 'pandas.core.series.Series'>
Um auf den Maximalwert für jede Spalte zuzugreifen, haben Sie folgende Möglichkeiten:
>>> df.max().ix['user_id']
943
>>> df.max().ix['item_id']
1682
Für Kommentarartikel auf Japanisch ist http://oceanmarine.sakura.ne.jp/sphinx/group/group_pandas.html leicht zu verstehen.
An diesem Punkt müssen Sie lediglich jedes Datenelement ernsthaft verarbeiten.
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.]]
Im Allgemeinen handelt es sich um eine spärliche Matrix (in vielen Filmen ist die Anzahl, die eine Person bewertet, begrenzt), daher scheint es besser, spärlich zu verwenden.
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.]]
das ist alles.
Ich habe ein Problem gefunden, bei dem die erste Zeile und die erste Spalte extra waren, also habe ich es behoben. Im ersten Entwurf habe ich wie folgt geschrieben. ..
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']