我集中每个人的多个数据行

时间:2016-12-23 01:51:26

标签: python database pivot-table

所以基本上,我有一个类似于这个的数据集:

人|类|分数

David,Comp sci,A
大卫,英文,B
大卫,化学,A
劳拉,化学,A
亨利,英语,D
亨利,法国人,A
亨利,艺术,B
Clara,Comp Sci,B
克拉拉,英语,A

所以这里的想法是我放入自己的套装,例如, 我:
  化学,B
    英文,A
Comp Sci,B

如果查看数据集,您会看到我的类与David最相似。我希望我的程序将名称从大多数到最不相似的方式排序。除了这种情况,大卫并不是最相似的。它实际上是克拉拉。这是一个想法:Clara有两个类与我的类完全相同。大卫有同样的课程,但他的成绩只是略微偏离我的。因此,我不会担心这样做的数学,因为关于一个人的成绩是否更相关或者课程数量是多少。

所以这是我的问题:我如何在python中为机器学习组织这样的东西?如果每行有一个名字,我会知道怎么做,但在这种情况下,一个人可以参加多个班级。这些多次出现是独立事件。我想到的是,我希望该计划能够根据他们与我的相似性给予给定学生权重。例如,我可以说"因为Clara与我有更多相似之处,当我点一份比萨饼时,她告诉我她想要辣椒粉更有可能让我订购意大利辣香肠而不是亨利建议的任何东西,因为亨利没有&#39在任何事情上都有类似的味道。然而,如果她喜欢意大利辣香肠但我绝对讨厌意大利辣香肠(或其他人讨厌意大利辣香肠),那么我将完全无视她的要求。"。所以,我正在添加加权"得分"本身基于它们的相似性。

我还有两个问题:如何为人们处理一组关键字?例如,对于每节课中学到的东西,我可以说" David,comp sci,A,(时间复杂度,二叉树,if语句)"。我想用它来查找哪个类最符合这些关键字。所以,如果我问什么是二叉树和时间复杂性,程序会根据每个人的关键词吐出计算机科学。
另一个问题是,哪种算法效果最好?在我看来,决策树在我的情况下效果最好,但我不确定。

1 个答案:

答案 0 :(得分:0)

这是一个基本实现,展示了我在评论中所说的内容。我留下关键词,解析结果,并作为练习扩展到你,问你想要的任何问题,我将修改这篇文章的任何细节。

您可以对关键字执行完全相同的操作,如果您想保留它们或类,那么这是可行的。结果的进一步使用可以使用ML,但我的直觉说还有更简单的方法。

此外,确定课程的确切价值和成绩是另一项任务。这会严重影响结果。当你决定课程或成绩是否更重要时......这在很大程度上取决于使用情况,你甚至可以根据需要使用“偏向滑块”来改变它。

这是一个相当强大的评分功能:

import GHC.TypeLits data Tagged :: Symbol -> Nat -> * -> * where One :: a -> Tagged "one" 1 a Two :: a -> Tagged "two" 2 a Three :: a -> Tagged "three" 3 a

scores[name] += (2*(2-bias)) - (bias * abs(data_point[1] - pivot_point[1]))

结果:

import numpy as np

people = """David, Comp Sci, A
David, English, B
David, Chemistry, A
Laura, Chemistry, A
Henry, English, D
Henry, French, A
Henry, Art, B
Clara, Comp Sci, B
Clara, English, A
OrbDeceptionist, Chemistry, B
OrbDeceptionist, English, A
OrbDeceptionist, Comp Sci, B"""


def get_names(dataset):
    names = []

    for line in dataset.split('\n'):
        name = line.split(',')[0]
        if name not in names:
            names.append(name)

    return names


grade_table = {'A': 0, 'B': 1, 'C': 2, 'D': 3, 'F': 4}
def get_classes(dataset, person):
    classes = []

    for line in dataset.split('\n'):
        name, subject, grade = line.split(',')
        if name == person:
            classes.append((subject, grade_table[grade.strip(' ')]))

    return classes


def most_similar(dataset, pivot, bias=0.3):
    pivot_data = get_classes(dataset, pivot)

    scores = {}

    names = get_names(dataset)

    for name in names:
        person_data = get_classes(dataset, name)

        for pivot_point in pivot_data:
            for data_point in person_data:
                if data_point[0] == pivot_point[0]:
                    if name not in scores:
                        scores[name] = 0

                    scores[name] += (2*(2-bias)) - (bias * abs(data_point[1] - pivot_point[1]))

    scores.pop(pivot)
    # You don't want to round in your final version, this is just to make it cleaner to see for the example.
    for k, v in scores.items():
        scores[k] = round(v)

    return scores


print('High bias favors grades, low bias favors classes.')
for b in np.arange(0.0, 1.1, 0.1):
    print('bias:', b, "|", most_similar(people, "OrbDeceptionist", b))