как применить логистическую регрессию к тестовым данным после запуска модели на данных поезда - PullRequest
1 голос
/ 06 мая 2019

Я пытался научиться машинному обучению, но не могу понять, как применить алгоритмы к тестовым данным.В этом примере, над которым я работал, я пытался применить модель логистической регрессии, которая использовалась в обучающих данных, к новому набору тестовых данных.Два набора данных входят в два разных файла CSV: titanic_train.csv и titanic_test.csv.я могу применить модель к данным поезда, но не могу применить ее к тестовым данным.

Я использую модель, используя ноутбук Anaconda Jupiter и python 3.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

#this where i load the data

train = pd.read_csv('titanic_train.csv')
test = pd.read_csv('titanic_test.csv')

#impute age


def impute_age(cols):
    Age = cols[0]
    Pclass = cols[1]

if pd.isnull(Age):
    if Pclass == 1:
        return 37
    elif Pclass == 2:
        return 29
    else:
        return 24
else:
    return Age


def convert_data(dataset):
    temp_data = dataset.copy()
    temp_data['Age'] = temp_data[['Age','Pclass']].apply(impute_age,axis=1)
    sex = pd.get_dummies(temp_data['Sex'],drop_first=True)
    embark = pd.get_dummies(temp_data['Embarked'],drop_first=True)
    temp_data.drop(['Sex','Embarked','Name','Ticket'],axis=1,inplace=True)
    temp_data = pd.concat([temp_data,sex,embark],axis=1)
    temp_data.drop('Cabin',axis=1,inplace=True)
    temp_data.dropna(inplace=True)
    return temp_data

train_dataset = convert_data(train) # titanic_train.csv
test_dataset = convert_data(test) # titanic_test.csv


from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = 
train_test_split(train.drop('Survived',axis=1), 
                                            train['Survived'], test_size=0.30, 
                                            random_state=101)

#next is the logistic regression

from sklearn.linear_model import LogisticRegression
logmodel = LogisticRegression()
logmodel.fit(X_train,y_train)


# i then get an error 

#ValueError: could not convert string to float: 'S'
#i changed train.drop to train_dataset.drop and then passed it into the model ie this

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = 
train_test_split(train_dataset.drop('Survived',axis=1), 
                                            train['Survived'], 
test_size=0.30, 
                                            random_state=101)


from sklearn.linear_model import LogisticRegression
logmodel = LogisticRegression()
logmodel.fit(X_train,y_train)

#output was:
#LogisticRegression(C=1.0, class_weight=None, dual=False, 
#fit_intercept=True,
#      intercept_scaling=1, max_iter=100, multi_class='warn',
 #     n_jobs=None, penalty='l2', random_state=None, solver='warn',
  #    tol=0.0001, verbose=0, warm_start=False)


#then i tried your code

predictions = logmodel.predict(test.drop('Survived', axis = 1))

#this then gives me the report

from sklearn.metrics import classification_report
print(classification_report(test['Survived'],predictions))

#and get the error   KeyError: "['Survived'] not found in axis"



#so i tried changing it

predictions = logmodel.predict(test_dataset)
from sklearn.metrics import classification_report
print(classification_report(test['Survived'],predictions))

#and got a new error:         KeyError: 'Survived'

, просто чтобы разобратьсяпри любой путанице я печатал столбцы в поезде и тестовые данные

print (train.columns)
print (test.columns)

#Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
   'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
  dtype='object')
#Index(['PassengerId', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp', 'Parch',
   'Ticket', 'Fare', 'Cabin', 'Embarked'],
  dtype='object')

я хочу иметь возможность применить модель к новым данным, найденным в другом файле titanic_test.csv

1 Ответ

0 голосов
/ 06 мая 2019

Прежде всего, создайте функцию операций, которые вы выполняете с набором обучающих данных.Потому что те же операции должны применяться и к тестовому набору данных.Таким образом, вы должны иметь что-то вроде этого:

train = pd.read_csv('titanic_train.csv')
test = pd.read_csv('titanic_test.csv')

#impute age


def impute_age(cols):
    Age = cols[0]
    Pclass = cols[1]

    if pd.isnull(Age):
        if Pclass == 1:
            return 37
        elif Pclass == 2:
            return 29
        else:
            return 24
    else:
        return Age


def convert_data(dataset):
    temp_data = dataset.copy()
    temp_data['Age'] = temp_data[['Age','Pclass']].apply(impute_age,axis=1)
    sex = pd.get_dummies(temp_data['Sex'],drop_first=True)
    embark = pd.get_dummies(temp_data['Embarked'],drop_first=True)
    temp_data.drop(['Sex','Embarked','Name','Ticket'],axis=1,inplace=True)
    temp_data = pd.concat([temp_data,sex,embark],axis=1)
    temp_data.drop('Cabin',axis=1,inplace=True)
    temp_data.dropna(inplace=True)
    return temp_data

train_dataset = convert_data(train) # titanic_train.csv
test_dataset = convert_data(test) # titanic_test.csv


from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(train.drop('Survived',axis=1), 
                                                train['Survived'], 
test_size=0.30, 
                                                random_state=101)

#next is the logistic regression

from sklearn.linear_model import LogisticRegression
logmodel = LogisticRegression()
logmodel.fit(X_train,y_train)

predictions = logmodel.predict(test.drop('Survived', axis = 1))

#this then gives me the report

from sklearn.metrics import classification_report
print(classification_report(test['Survived'],predictions))
...