Я хочу рассчитать 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)