76

5つ星システムを使用して、顧客の評価で多数の製品を並べ替えようとしています。私がこれを設定しているサイトには多くの評価がなく、新しい製品を追加し続けているため、通常、評価の数が少ないいくつかの製品があります。

平均的な星の評価を使用してみましたが、評価の数が少ないとそのアルゴリズムは失敗します。

たとえば、3x 5つ星の評価がある製品は、100x5つ星の評価と2x2つ星の評価がある製品よりも見栄えが良くなります。

2番目の製品は、評価の数が多いために統計的に信頼性が高いため、高く表示されるべきではありませんか?

4

10 に答える 10

87

2015 年より前に、インターネット ムービー データベース (IMDb) は、上位 250 の映画リストをランク付けするために使用される式を公開しました。引用するには:

トップ レートの 250 タイトルを計算する式は、真のベイジアン推定値を示します。

weighted rating (WR) = (v ÷ (v+m)) × R + (m ÷ (v+m)) × C

どこ:

  • R = 映画の平均 (平均)
  • v = 映画の投票数
  • m = トップ 250 にリストされるために必要な最低投票数 (現在 25000)
  • C = レポート全体の平均投票数 (現在 7.0)

トップ 250 については、通常の有権者からの投票のみが考慮されます。

理解するのはそれほど難しいことではありません。式は次のとおりです。

rating = (v / (v + m)) * R +
         (m / (v + m)) * C;

これは数学的に次のように簡略化できます。

rating = (R * v + C * m) / (v + m);

変数は次のとおりです。

  • R – アイテム自身の評価。R はアイテムの投票の平均です。(たとえば、アイテムに投票がない場合、その R は 0 です。誰かが 5 つ星を付けた場合、R は 5 になります。他の誰かが 1 つ星を付けた場合、R は 3 になり、平均は になり[1, 5]ます。)
  • C – アイテムの平均評価。現在のアイテムを含む、データベース内のすべてのアイテムの R を見つけ、それらの平均をとります。(データベースに 4 つの項目があり、それらの評価が であるとし[2, 3, 5, 5]ます。C は 3.75 で、これらの数値の平均です。)
  • v – アイテムの投票数。(別の例を挙げると、5 人が項目に投票した場合、v は 5 です。)
  • m – 調整可能なパラメーター。評価に適用される「平滑化」の量は、m に対する投票数 (v) に基づいています。満足のいく結果が得られるまで m を調整します。また、IMDb の m の説明を「リストに記載するために必要な最小投票数」と誤解しないでください。このシステムは、m よりも少ない投票でアイテムをランク付けすることが完全に可能です。

式が行うことはすべて、平均を計算する前に、それぞれの値が C である m 個の架空の票を追加することです。最初に、十分なデータがない場合 (つまり、投票数が m よりも大幅に少ない場合)、これにより空白が平均データで埋められます。しかし、投票が蓄積されるにつれて、最終的に架空の投票は実際の投票によってかき消されます。

このシステムでは、投票によって評価が大きく変動することはありません。代わりに、彼らはそれをある方向に少し乱すだけです.

0 票の場合、架空の票のみが存在し、すべて C です。したがって、各項目の評価は C から始まります。

以下も参照してください。

  • デモ。_ 「解決」をクリックします。
  • IMDbのシステムの別の説明。
  • 同様のベイズ星評価システムの説明。
于 2009-09-11T14:33:29.917 に答える
24

Evan Miller は、5 つ星の評価をランク付けするためのベイジアン アプローチを 示しています。ここに画像の説明を入力

どこ

  • nkk星評価の数、
  • skk星の「価値」(ポイント)です。
  • Nは総投票数です
  • Kは星の最大数です (例: 5 つ星の評価システムでは K=5)。
  • z_alpha/21 - alpha/2正規分布の分位数です。実際の並べ替え基準が計算された並べ替え基準と少なくとも同じ大きさであるという 95% の信頼性 (ベイズ事後分布に基づく) が必要な場合は、z_alpha/2= 1.65 を選択します。

Python では、ソート基準は次のように計算できます。

def starsort(ns):
    """
    http://www.evanmiller.org/ranking-items-with-star-ratings.html
    """
    N = sum(ns)
    K = len(ns)
    s = list(range(K,0,-1))
    s2 = [sk**2 for sk in s]
    z = 1.65
    def f(s, ns):
        N = sum(ns)
        K = len(ns)
        return sum(sk*(nk+1) for sk, nk in zip(s,ns)) / (N+K)
    fsns = f(s, ns)
    return fsns - z*math.sqrt((f(s2, ns)- fsns**2)/(N+K+1))

たとえば、項目に 60 個の 5 つ星、80 個の 4 つ星、75 個の 3 つ星、20 個の 2 つ星、および 25 個の 1 つ星がある場合、その全体的な星の評価は約 3.4 になります。

x = (60, 80, 75, 20, 25)
starsort(x)
# 3.3686975120774694

5つ星評価のリストを並べ替えることができます

sorted([(60, 80, 75, 20, 25), (10,0,0,0,0), (5,0,0,0,0)], key=starsort, reverse=True)
# [(10, 0, 0, 0, 0), (60, 80, 75, 20, 25), (5, 0, 0, 0, 0)]

これは、より多くの評価が全体的な星の値に与える影響を示しています。


この式は、特に投票数が少ない場合 (たとえば、300 未満) に、Amazon、Ebay、Wal-mart などのサイトが報告する総合評価よりも少し低い総合評価を与える傾向があることがわかります。これは、投票数が少ないほど不確実性が高くなることを反映しています。投票数が (数千に) 増加すると、全体として、これらの評価式はすべて (加重) 平均評価になる傾向があります。


この式はアイテム自体の 5 つ星評価の頻度分布のみに依存するため、頻度分布を足し合わせるだけで、複数のソースからのレビュー を組み合わせる(または、新しい投票に照らして全体的な評価を更新する) のは簡単です。


IMDb 式とは異なり、この式は、すべてのアイテムの平均スコアにも、人為的な最小投票数のカットオフ値にも依存しません。

さらに、この式は、星の平均数と投票数だけでなく、完全な度数分布を利用しています。また、5 つ星が 10 個と 1 つ星が 10 個ある項目は、3 つ星評価が 20 個ある項目よりも不確実性が高い (したがって、それほど高く評価されない) として扱われるべきであるため、当然のことです。

In [78]: starsort((10,0,0,0,10))
Out[78]: 2.386028063783418

In [79]: starsort((0,0,20,0,0))
Out[79]: 2.795342687927806

IMDb 式はこれを考慮していません。

于 2016-12-04T12:38:08.573 に答える
19

スターベースの評価システムの優れた分析については、このページを参照してください。賛成票/反対投票ベースのシステムの優れた分析については、このページを参照してください。

上下投票の場合、あなたが持っている評価が与えられた場合、「実際の」スコア (無限の評価があった場合) が特定の量 (たとえば、あなたの他のアイテムの同様の数など) よりも大きい確率を推定したいとします。に対して再ソート)。

答えについては 2 番目の記事を参照してください。この記事では、方程式とサンプルの Ruby コード (別の言語に簡単に翻訳できます) を示します。

于 2010-03-26T21:00:23.570 に答える
7

どれだけ複雑にしたいかによっては、その人が行った評価の数とそれらの評価に基づいて評価をさらに重み付けすることもできます。その人が 1 つの評価しか付けていない場合、それは偽りの評価である可能性があり、評価が低くなる可能性があります。または、その人がカテゴリ a で多くのことを評価し、カテゴリ b ではほとんど評価せず、平均評価が 5 つ星のうち 1.3 である場合、カテゴリ a は、このユーザーの低い平均スコアによって人為的に重み付けされている可能性があるように聞こえます。調整する必要があります。

しかし、それを複雑にするのは十分です。簡単にしましょう。

特定の項目について、ReviewCount と AverageRating の 2 つの値のみを使用して作業していると仮定すると、ReviewCount が本質的に「信頼性」の値であると考えるのが理にかなっています。ただし、ReviewCount の低い項目のスコアを下げるだけではありません。1 つ星の評価は、1 つの 5 つ星評価と同じくらい信頼性が低いと考えられます。したがって、私たちがやりたいことは、おそらく中間に向かって平均的なものです: 3.

つまり、基本的には、X * AverageRating + Y * 3 = the-rating-we- want のような方程式を考えています。この値を正しく表示するには、X+Y を 1 に等しくする必要があります。また、ReviewCount が増加するにつれて X の値も増加する必要があります...レビュー数が 0 の場合、x は 0 になるはずです (「 3")、無限のレビュー数の場合、X は 1 である必要があります (式 = AverageRating になります)。

では、X 方程式と Y 方程式とは何ですか? X 式では、独立変数が無限大に近づくにつれて、従属変数が漸近的に 1 に近づくようにします。Y = 1/(factor^RatingCount) および (X が 1-Y に等しくなければならないという事実を利用して) X = 1 – (1/(factor^RatingCount)

次に、探している範囲に合わせて「係数」を調整します。

この単純な C# プログラムを使用して、いくつかの要素を試してみました。

        // We can adjust this factor to adjust our curve.
        double factor = 1.5;  

        // Here's some sample data
        double RatingAverage1 = 5;
        double RatingCount1 = 1;

        double RatingAverage2 = 4.5;
        double RatingCount2 = 5;

        double RatingAverage3 = 3.5;
        double RatingCount3 = 50000; // 50000 is not infinite, but it's probably plenty to closely simulate it.

        // Do the calculations
        double modfactor = Math.Pow(factor, RatingCount1);
        double modRating1 = (3 / modfactor)
            + (RatingAverage1 * (1 - 1 / modfactor));

        double modfactor2 = Math.Pow(factor, RatingCount2);
        double modRating2 = (3 / modfactor2)
            + (RatingAverage2 * (1 - 1 / modfactor2));

        double modfactor3 = Math.Pow(factor, RatingCount3);
        double modRating3 = (3 / modfactor3)
            + (RatingAverage3 * (1 - 1 / modfactor3));

        Console.WriteLine(String.Format("RatingAverage: {0}, RatingCount: {1}, Adjusted Rating: {2:0.00}", 
            RatingAverage1, RatingCount1, modRating1));
        Console.WriteLine(String.Format("RatingAverage: {0}, RatingCount: {1}, Adjusted Rating: {2:0.00}",
            RatingAverage2, RatingCount2, modRating2));
        Console.WriteLine(String.Format("RatingAverage: {0}, RatingCount: {1}, Adjusted Rating: {2:0.00}",
            RatingAverage3, RatingCount3, modRating3));

        // Hold up for the user to read the data.
        Console.ReadLine();

したがって、わざわざコピーする必要はありません。次の出力が得られます。

RatingAverage: 5, RatingCount: 1, Adjusted Rating: 3.67
RatingAverage: 4.5, RatingCount: 5, Adjusted Rating: 4.30
RatingAverage: 3.5, RatingCount: 50000, Adjusted Rating: 3.50

そんな感じ?必要に応じて「係数」値を調整して、必要な種類の重み付けを取得できます。

于 2009-09-11T15:04:07.617 に答える
7

算術平均ではなく中央値で並べ替えることができます。この場合、両方の例の中央値が 5 であるため、並べ替えアルゴリズムでは両方の重みが同じになります。

モードを使用して同じ効果を得ることができますが、おそらく中央値の方が適切です。

5 つ星の評価が 100 個ある製品に追加の重みを割り当てたい場合は、何らかの重み付けモードを使用して、中央値が同じでも全体の投票数が多い評価に重みを割り当てることをお勧めします。

于 2009-09-11T14:29:13.957 に答える
3

多くの計算を使用せずにほとんど動作する高速で安価なソリューションが必要な場合は、ここに 1 つのオプションがあります (1 ~ 5 の評価尺度を想定)。

SELECT Products.id, Products.title, avg(Ratings.score), etc
FROM
Products INNER JOIN Ratings ON Products.id=Ratings.product_id
GROUP BY 
Products.id, Products.title
ORDER BY (SUM(Ratings.score)+25.0)/(COUNT(Ratings.id)+20.0) DESC, COUNT(Ratings.id) DESC

25 を足して合計評価 + 20 で割ることにより、基本的に、合計評価に最低 10 のスコアと最高 10 のスコアを追加し、それに応じて並べ替えます。

これには既知の問題があります。たとえば、評価の少ない低スコアの製品に不当に報酬を与えます (このグラフが示すように、平均スコアが 1 で評価スコアが 1 つだけの製品は 1.2 であり、平均スコアが 1 で 1,000 以上の評価スコアを持つ製品は 1.05 に近づきます)。また、評価の少ない高品質の製品を不当に罰していると主張することもできます.

このグラフは、1 ~ 1000 の評価で 5 つの評価すべてに対して何が起こるかを示してい ます。 %2C1%2C1000%7D%2C%7By%2C0%2C6%7D%5D

最下位の格付けで上方への落ち込みが見られますが、全体としては妥当なランキングだと思います。次のように見ることもできます。

http://www.wolframalpha.com/input/?i=Plot3D%5B6-%28%2825%2Bxy%29/%2820%2Bx%29%29%2C%7Bx%2C1%2C1000%7D%2C%7By %2C0%2C6%7D%5D

このグラフのほとんどの場所にビー玉を落とすと、スコアと評価の両方が高い製品に向かって自動的に転がります。

于 2010-10-12T16:33:08.367 に答える
0

1 つのオプションは、Microsoft の TrueSkill システムのようなもので、スコアは で与えられmean - 3*stddev、定数を微調整できます。

于 2010-10-12T17:03:48.577 に答える
0

明らかに、評価の数が少ないため、この問題は統計上のハンディキャップになります。それにもかかわらず...

総合評価の品質を向上させるための重要な要素は、「評価者を評価する」ことです。つまり、特定の「評価者」が (他の評価者と比較して) 提供した評価のタブを維持することです。これにより、集計プロセス中に投票を比較検討できます。

もう 1 つの解決策は、エンド ユーザーに基礎となるアイテムの投票数 (またはその範囲の表示) を提供することです。

于 2009-09-11T14:34:13.867 に答える
0

しばらく見て、ベイジアンシステムを選択します。誰かがRubyを使用している場合、ここにgemがあります:

https://github.com/wbotelhos/rating

于 2018-01-11T22:10:05.620 に答える
-3

Toby Segaran (OReilly) ISBN 978-0-596-52932-1 による書籍「Programming Collective Intelligence」を強くお勧めします。この本では、群衆の行動から意味のあるデータを抽出する方法について説明しています。例は Python で書かれていますが、変換するのは簡単です。

于 2009-09-11T15:01:56.277 に答える