ユーザーと作成者のデータに基づいてレコメンデーションシステムを設計する
オフライン実験ステップ
今回は、推奨アルゴリズムとその評価は主にオフライン実験に依存しているため、最初のレビュー:
データセットの内容を読み取り、トレーニングセットとテストセットに分割します
ステートメント
このミッションのデータセットは、QQMusicの一部のユーザーのダウンロード記録です。datファイルの各行には、ダウンロードした曲に対応するユーザーIDとアーティストが含まれます(ユーザーIDは複数行に表示されます)。テストセットとトレーニングセットをディクショナリタイプとして定義し、値をリストタイプとして定義することを選択しました。
読んだ
with openステートメントを使用してファイルを開き、データをリストに入れます。これには、改行などの特殊文字の削除も含まれます。
datファイルにデータを収集した後、英語以外の文字を解決するにはどうすればよいですか?
ファイルを開くとき、パラメーターencoding = 'UTF-8'は、 'rb'によって読み取られるコンテンツとは異なります。
コーデックモジュールを使用して、ファイル処理用のコードを指定します
理解:
除算
ユーザー行動データセットは、一様分布に従ってランダムにM個の部分に分割され、1つがテストセットとして選択され、残りのM-1部分がトレーニングセットとして使用されます。M個の実験を実行すると、M個の異なるトレーニングセットとテストセットを取得できます。データセットが十分に大きく、モデルが十分に単純である場合、オフライン実験を通じてアルゴリズムをすばやく選択するために、1つの実験のみを実行することもできます。
期間中、印刷でテストセットとトレーニングセットを出力して確認しましたが、コンテンツが多いとコンソールですべてのコンテンツを表示できないようです。
また、便宜上、トレーニングセットとテストセットをpkl形式で保存してデータパケットを使用しています。
ユーザーベースの協調フィルタリングアルゴリズム
アルゴリズム式(行列で実現できます。辞書行列を使用します):
- 類似性:
改善後:
- 興味:
プロセス記録
辞書キーが存在しない場合は、最初にdictdefaultまたはsetdefaultを実行し、存在するかどうかわからない場合はgetを使用する必要があることに注意してください。
dictdefaultの効率はsetdefaultよりも高くなければなりません。
マトリックスを構築する時間は2分に近いので、ピクルスを考慮することができます。
計算の精度、再現率、およびカバレッジにはトラバーサルプロセスが必要であるため、効率を向上させるには、計算プロセスを統合するのが最善です。
それ以上に、プログラムが最初により合理的な構造を持ち、次に詳細を処理できる場合(たとえば、一部のサードパーティライブラリはより高速な機能を提供する場合があります)、効率を効果的に向上させることができます。
データセットdatファイルのencoding = 'UTF-8'( 'rb'によって読み取られたコンテンツとは異なります)の後で、アルゴリズムの推奨結果を使用します。
マイナーリビジョン:
アイテムベースの協調フィルタリングアルゴリズム(ユーザーベースとの類似点があります)
アルゴリズム式
アイテムベースの協調フィルタリングアルゴリズムは、主に2つのステップに分かれています。
(1)アイテム間の類似度を計算します。
(2)アイテムの類似性とユーザーの過去の行動に基づいて、ユーザーの推奨リストを生成します。
-
類似性:類似性を
計算する前に転置リストを作成する必要もありますが、今回はユーザー->アーティスト間の対応です。
-
興味:
改善されたバージョン: -
類似性は正規化されます:
プロセス記録(主に高速計算?)
私のテストセットとトレーニングセットの辞書はアーティストに対応するユーザーであるため、転置リストを作成する必要はありません。
類似性を正規化して、最終的な類似性マトリックスを取得できます
プログラムはUserCFよりもはるかに高速に実行されます
マトリックスファイルのサイズに驚いた、多分私のUserCFアルゴリズムはまだ欠陥がある
カバレッジ率は一般的に高すぎません。類似度が1未満の数値で除算されるため、利息の値はUserCFよりも数値的に大きくなります。
マイナーな変更:
ノート
2.コードはPythonでラップされ、三重引用符メソッドがあります
3. *ファイル処理中に、パラメーターで渡された関数と返されたオブジェクトは、同じ名前であっても同じではないことがわかりました。
4.オペレータモジュールが提供するitemgetter関数は、オブジェクトのどの次元のデータを取得するために使用され、パラメータはいくつかのシリアル番号です。operator.itemgetter関数は値を取得しませんが、関数が定義されており、関数がオブジェクトに作用する場合にのみ値を取得できることに注意してください。
from operator import itemgetter
辞書のリストを公開鍵でソートします
。itemgetter(0)などのitemgetterは辞書キーに従ってソートされ、1は値です。
5. Pythonは多次元辞書を作成できますが、numpyライブラリには配列や行列などの関数が含まれています。PandasはNumpyに基づいています。
Pythonの2次元辞書のいくつかの小さな例
Pythonnumpyでの行列の使用法の要約
6. numpyとパンダ:
Numpy:是数值计算的扩展包,它能高效处理N维数组,复杂函数,线性代数
Panadas:是做数据处理。市python的一个数据分析包
numpy对象最重要特点向量化运算,pandas对象最重要特点是字典和列表混合
7.字典的get、setdefault、コレクションからimport defaultdict、defaultdict()
Pythonでは、辞書はキーを介してアクセスされます。キーが存在しない場合、「KeyError」例外が発生します。これを回避するには、collectionsクラスのdefaultdict()メソッドを使用して、ディクショナリのデフォルト値を提供します。(または、get、setdefault、およびその他のメソッドを使用します)
from collections import defaultdict
# defaultdict接受一个工厂函数作为参数
dict1 = defaultdict(int)
dict2 = defaultdict(set)
dict3 = defaultdict(str)
dict4 = defaultdict(list)
dict1[2] ='two'
print(dict1[1])
print(dict2[1])
print(dict3[1])
print(dict4[1])
# 输出:
0
set()
[]
#
>>> d= defaultdict(dict())
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
d= defaultdict(dict())
TypeError: first argument must be callable or None
>>> d= defaultdict(dict)
>>> d
defaultdict(<class 'dict'>, {
})
setdefaultとdefaultdictの重要な違い:(
コード分析構造への影響が非常に大きいことがわかりました)
#defaultdict
>>> from collections import defaultdict
>>> d=defaultdict(str)
>>> d['0']
''
>>> d=defaultdict('abc')
Traceback (most recent call last):
File "<pyshell#17>", line 1, in <module>
d=defaultdict('abc')
TypeError: first argument must be callable or None
>>>print(d)
defaultdict(<class 'str'>, {
'0': ''})
#setdefault
>>> d={
}
>>> for i in range(0,10):
d.setdefault(str(i),'abc')
>>> d
{
'i': 1, '0': 1, '10': 1, '1': 'abc', '2': 'abc', '3': 'abc', '4': 'abc', '5': 'abc', '6': 'abc', '7': 'abc', '8': 'abc', '9': 'abc'}
defaultdictでは、最初のパラメーターとしてlistを使用し、次にsetdefaultを使用すると、対応するリストを辞書に簡単に変換し、listを使用してキーと値のペアのシーケンスをリスト辞書に変換できます。
8.関数を呼び出すと、関数の戻り値のみが受信され、その中の出力ステートメントも実行されます。
9.フォーマットに関するちょっとしたメモ
>>> precision = 0.52333
>>> recall=0.2326
>>> coverage=0.9456
>>> print('{:.2%} {:.2%}'.format(precision))
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
print('{:.2%} {:.2%}'.format(precision))
IndexError: tuple index out of range
>>> print('{0:.2%} {0:.2%}'.format(precision))
52.33% 52.33%
>>> print('准确率: {1:.2%}\n召回率: {2:.2%}\n覆盖率: {3:.2%}'.format(precision, recall, coverage))
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module> # 必须指定从0开始!!!,或不设位置!!
IndexError: tuple index out of range
>>> print('准确率: {0:.2%}\n召回率: {1:.2%}\n覆盖率: {2:.2%}'.format(precision, recall, coverage))
准确率: 52.33%
召回率: 23.26%
覆盖率: 94.56%
10. .items()は、各キーと値のペアがタプルに格納されているリストを返します。