матрица scipy к массиву numpy в задаче классификации - PullRequest
1 голос
/ 15 апреля 2019

У меня есть данные X_train (класс 'pandas.core.series.Series') с содержанием

print(X_train)

0       WASHINGTON  —   Congressional Republicans have...
1       After the bullet shells get counted, the blood...
2       When Walt Disney’s “Bambi” opened in 1942, cri...
3       Death may be the great equalizer, but it isn’t...
4       SEOUL, South Korea  —   North Korea’s leader, ...

, затем я хочу подготовить данные для классификации:

count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform(X_train)
tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)

и X_train_tfidfи X_train_counts теперь есть (класс 'scipy.sparse.csr.csr_matrix')

Но в моей функции логистической регрессии я могу работать с массивами-пустышками.Что я должен сделать, чтобы это исправить?

class LogisticRegression2:
    def __init__(self, lr=0.01, num_iter=100000, fit_intercept=True, theta=0, verbose=False):
        self.lr = lr
        self.num_iter = num_iter
        self.fit_intercept = fit_intercept
        self.theta = theta
        self.verbose = verbose

    def __add_intercept(self, X):
        intercept = np.ones((X.shape[0], 1))
        return np.concatenate((intercept, X), axis=1)

    def __sigmoid(self, z):
        return 1 / (1 + np.exp(-z))
        #return .5 * (1 + np.tanh(.5 * z))

    def __loss(self, h, y):
        return (-y * np.log(h) - (1 - y) * np.log(1 - h)).mean()

    def fit(self, X, y):
        if self.fit_intercept:
            X = self.__add_intercept(X)

        # weights initialization
        self.theta = np.zeros(X.shape[1])

        for i in range(self.num_iter):
            z = np.dot(X, self.theta)
            h = self.__sigmoid(z)
            gradient = np.dot(X.T, (h - y)) / y.size
            self.theta -= self.lr * gradient

            if(self.verbose == True and i % 10000 == 0):
                z = np.dot(X, self.theta)
                h = self.__sigmoid(z)
                print('loss: ', self.__loss(h, y))

    def predict_prob(self, X):
        if self.fit_intercept:
            X = self.__add_intercept(X)

        return self.__sigmoid(np.dot(X, self.theta))

    def predict(self, X, threshold=0.5):
        return self.predict_prob(X) >= threshold

Если я использую

X_train_dense = X_train_tfidf.toarray()

model = LogisticRegression2(lr=0.1, num_iter=100)
model.fit(X_train_dense, y_train)
preds = model.predict(X_train_dense)

У меня есть TypeError: неподдерживаемые типы операндов для -: 'float' и 'str'в

`gradient = np.dot(X.T, (h - y)) / y.size`

Если я попробую

def __add_intercept(self, X):
    intercept = np.ones((X.shape[0], 1))
    return hstack((intercept, X))

У меня ошибка памяти

...