форма ввода для расчета прироста информации - PullRequest
0 голосов
/ 28 ноября 2018

Я хочу рассчитать information gain для набора данных 20_newsgroup.

Я использую код здесь (также я поставил копию кода вниз вопроса).

Как видите, входные данные для алгоритма: X,y Моя путаница заключается в том, что X будет matrix с documents в строках и features as column.(согласно 20_newsgroup это 11314,1000 в случае, если я рассмотрел только 1000 функций).

, но согласно концепции получения информации, он должен рассчитывать прирост информации для each feature.

(такЯ ожидал увидеть код в цикле обхода каждой функции, поэтому входные данные для функции - это матрица, в которой строки - это объекты, а столбцы - это класс)

Но X здесь не является функцией, а X обозначает документыи я не вижу той части кода, которая заботится об этой части!(Я имею в виду рассмотрение каждого документа, а затем прохождение каждой функции этого документа; например, циклическое перемещение по строкам, но в то же время циклическое переключение по столбцам, поскольку объекты хранятся в столбцах).

Я прочитал это и , это и много похожих вопросов, но они не ясны с точки зрения формы матрицы ввода.

это код для чтения 20_newsgroup:

newsgroup_train = fetch_20newsgroups(subset='train')
X,y = newsgroup_train.data,newsgroup_train.target

cv = CountVectorizer(max_df=0.99,min_df=0.001, max_features=1000,stop_words='english',lowercase=True,analyzer='word')
X_vec = cv.fit_transform(X)

(X_vec.shape) - это (11314,1000), которого нет в наборе данных 20_newsgroup.Я думаю, что я неправильно рассчитываю прирост информации?

Это код для Information gain:

def information_gain(X, y):

    def _calIg():
        entropy_x_set = 0
        entropy_x_not_set = 0
        for c in classCnt:
            probs = classCnt[c] / float(featureTot)
            entropy_x_set = entropy_x_set - probs * np.log(probs)
            probs = (classTotCnt[c] - classCnt[c]) / float(tot - featureTot)
            entropy_x_not_set = entropy_x_not_set - probs * np.log(probs)
        for c in classTotCnt:
            if c not in classCnt:
                probs = classTotCnt[c] / float(tot - featureTot)
                entropy_x_not_set = entropy_x_not_set - probs * np.log(probs)
        return entropy_before - ((featureTot / float(tot)) * entropy_x_set
                             +  ((tot - featureTot) / float(tot)) * entropy_x_not_set)

    tot = X.shape[0]
    classTotCnt = {}
    entropy_before = 0
    for i in y:
        if i not in classTotCnt:
            classTotCnt[i] = 1
        else:
            classTotCnt[i] = classTotCnt[i] + 1
    for c in classTotCnt:
        probs = classTotCnt[c] / float(tot)
        entropy_before = entropy_before - probs * np.log(probs)

    nz = X.T.nonzero()
    pre = 0
    classCnt = {}
    featureTot = 0
    information_gain = []
    for i in range(0, len(nz[0])):
        if (i != 0 and nz[0][i] != pre):
            for notappear in range(pre+1, nz[0][i]):
                information_gain.append(0)
            ig = _calIg()
            information_gain.append(ig)
            pre = nz[0][i]
            classCnt = {}
            featureTot = 0
        featureTot = featureTot + 1
        yclass = y[nz[1][i]]
        if yclass not in classCnt:
            classCnt[yclass] = 1
        else:
            classCnt[yclass] = classCnt[yclass] + 1
    ig = _calIg()
    information_gain.append(ig)

    return np.asarray(information_gain)

1 Ответ

0 голосов
/ 28 ноября 2018

Что ж, после подробного изучения кода я узнал больше о X.T.nonzero().

На самом деле правильно, что получение информации должно проходить по функциям.Также верно, что матрица scikit-learn, которую мы здесь даем, основана на doc-features.

Но:

в коде, который использует X.T.nonzero(), что технически преобразует все ненулевые значения в массив,а затем в следующем цикле строки по длине этого диапазона массива (0, len(X.T.nonzero()[0]).

В целом, эта часть XTnonzero () [0] возвращает нам все функции, не равные нулю:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...