-1

나는이 오류가 무엇입니까해야합니다. 예측 결과를 얻고 싶지만 m.train(input_fn=get_input_fn ,steps=5000) 코드를 실행할 수 없습니다. 나는 항상 내가 한 것과 똑같은 오류가있다. 다음과 같은 입력 기능을 사용했지만 변경된 사항은 없습니다.항목은 _FeatureColumn

def input_fn_train(): 
    x=tf.constant(df_train.astype(np.float64)), 
    y=tf.constant(df_train[LABEL].astype(np.float64)) 
    return x, y 

def get_input_fn(data_set, num_epochs=None, shuffle=False): 
    return tf.estimator.inputs.pandas_input_fn(
     x=pd.DataFrame({k: data_set[k].values for k in data_set.columns}), 
     y=pd.Series(data_set[LABEL].values), num_epochs=num_epochs, 
        shuffle=shuffle) 

내가 무엇을해야하는지 이해할 수 없습니다. 무엇에 관한 오류입니까? 나는 인터넷 검색했지만 유용한 것을 찾지 못했습니다. 이 오류는 어떻게 처리 할 수 ​​있습니까? 코드는 다음과 같습니다. 감사!

import pandas as pd 
import tensorflow as tf 
import numpy as np 
import tempfile 

COLS= ["RowNumber","CustomerId","Surname","CreditScore","Geography", 
"Gender","Age","Tenure","Balance","NumOfProducts","HasCrCard", 
"IsActiveMember","EstimatedSalary","Exited"] 


FEATURES = ["CreditScore","Age","Tenure","Balance","NumOfProducts", 
     "HasCrCard","IsActiveMember", "EstimatedSalary"] 

LABEL="Exited" 

df_train = pd.read_csv("Churn_Modelling.csv", skipinitialspace=True, 
header=0) 
df_test = pd.read_csv("Churn_Modelling.csv", skipinitialspace=True, 
header=0) 
test_label = df_test[LABEL].astype(float) 
df_test.drop("Surname", axis = 1, inplace=True) 
df_test.drop("RowNumber", axis = 1, inplace=True) 
df_test.drop("CustomerId", axis = 1, inplace=True) 
df_train.drop("CustomerId", axis = 1, inplace=True) 
df_train.drop("Surname", axis = 1, inplace=True) 
df_train.drop("RowNumber", axis = 1, inplace=True) 
df_train.drop("Geography", axis = 1, inplace=True) 
df_train.drop("Gender", axis = 1, inplace=True) 

def get_input_fn(): 
    return {'x': tf.constant(df_train[FEATURES].as_matrix(), tf.float32, 
      df_train.shape), 
      'y': tf.constant(df_train[LABEL].as_matrix(), tf.float32, 
      df_train.shape) 
      } 

df=df_train.select_dtypes(exclude=['object']) 
numeric_cols=df.columns 

m = tf.estimator.LinearClassifier(model_dir=model_dir, feature_columns= 
[numeric_cols]) 

m.train(input_fn=get_input_fn ,steps=5000) 
results = m.evaluate(input_fn= get_input_fn(df_test, num_epochs=1, 
shuffle=False),steps=None) 

y = m.predict(input_fn=get_input_fn(df_test, num_epochs=1, shuffle=False)) 
pred = list(y) 

rowNumber=0 
for i in pred: 
    print(str(rowNumber)+': '+str(pred[i])) 
    rowNumber=rowNumber+1 
+0

공통 파일을 업로드하고 있지만 훈련 및 테스트 설정에서 다른 열을 삭제하는 것 같습니다. –

답변

0

명확하게 작동합니다.

import pandas as pd 
import tensorflow as tf 
import tempfile 
from sklearn.model_selection import train_test_split 
from sklearn.metrics import accuracy_score 
from sklearn.metrics import classification_report 
from sklearn.metrics import confusion_matrix 
from sklearn.metrics import cohen_kappa_score 
from sklearn.metrics import f1_score 
from sklearn.metrics import recall_score 


def split_data(data, rate, label): 
    data = data.dropna() 

    train_data, test_data = train_test_split(data, test_size=rate) 

    train_label = train_data[label] 
    train_data = train_data.drop(label, 1) 

    test_label = test_data[label] 
    test_data = test_data.drop(label, 1) 
    return train_data, train_label, test_data, test_label 



LABEL = "Exited" 

data = pd.read_csv("Churn_Modelling.csv", skipinitialspace=True, 
    header=0) 

data.drop("Surname", axis=1, inplace=True) 
data.drop("RowNumber", axis=1, inplace=True) 
data.drop("CustomerId", axis=1, inplace=True) 
data.drop("Geography", axis=1, inplace=True) 
data.drop("Gender", axis=1, inplace=True) 
x_train, y_train, x_test, y_test = split_data(data, 0.20, LABEL) 



def get_input_fn_train(): 
    input_fn = tf.estimator.inputs.pandas_input_fn(
     x=x_train, 
     y=y_train, 
     shuffle=False 
    ) 
    return input_fn 

def get_input_fn_test(): 
    input_fn = tf.estimator.inputs.pandas_input_fn(
     x=x_test, 
     y=y_test, 
     shuffle=False 
    ) 
    return input_fn 


feature_columns = tf.contrib.learn.infer_real_valued_columns_from_input_fn 
(get_input_fn_train()) 


model_dir = tempfile.mkdtemp() 
m = tf.estimator.LinearClassifier(model_dir=model_dir, 
feature_columns=feature_columns) 

# train data 
m.train(input_fn=get_input_fn_train(), steps=5000) 

# you can get accuracy, accuracy_baseline, auc, auc_precision_recall, 
#average_loss, global_step, label/mean, lossprediction/mean 

results = m.evaluate(input_fn=get_input_fn_test(), steps=None) 

print("model directory = %s" % model_dir) 
for key in sorted(results): 
    print("%s: %s" % (key, results[key])) 

# get prediction results 
y = m.predict(input_fn=get_input_fn_test()) 
predictions = list(y) 
pred1=pd.DataFrame(data=predictions) 
prediction=pd.DataFrame(data=pred1['class_ids']) 
pred=[] 
for row in prediction["class_ids"]: 
    pred.append(row[0]) 

rowNumber = 0 
for i in pred: 
    print(str(rowNumber) + ': ' + str(i)) 
    rowNumber = rowNumber + 1 


def calculate(prediction, LABEL): 
    arr = {"accuracy": accuracy_score(prediction, LABEL), 
      "report": classification_report(prediction, LABEL), 
      "Confusion_Matrix": confusion_matrix(prediction, LABEL), 
      "F1 score": f1_score(prediction, LABEL), 
      "Recall Score": recall_score(prediction, LABEL), 
      "cohen_kappa": cohen_kappa_score(prediction, LABEL) 
      } 
    return arr 


pred2 = pd.DataFrame(data=pred) 

print(calculate(pred2.round(), y_test)) 
2

가장 먼저 실수 한 것은 tf.estimator.LinearClassifier입니다. 데이터 프레임 인덱스 df.columnsfeature_columns에 전달했지만 tensorflow feature columns의 목록을 전달해야합니다. 열은 숫자 또는 범주 형인지, 나중에 인코딩 유형인지를 정의해야합니다.

둘째, pandas 데이터 프레임을 읽고 있기 때문에 입력 기능을 많이 단순화 할 수 있습니다. tf.estimator.inputs.pandas_input_fn 만 사용하십시오.

귀하의 .csv은 다른 경우가 많습니다. 일부 값으로 더미를 만들었습니다. 입력을 읽고 모델을 올바르게 맞추는 방법은 다음과 같습니다.

import pandas as pd 
import tensorflow as tf 

FEATURES = ["CreditScore", "Age", "Tenure", "Balance", "NumOfProducts", 
      "HasCrCard", "IsActiveMember", "EstimatedSalary", "Exited"] 

credit_score = tf.feature_column.numeric_column("CreditScore") 
age = tf.feature_column.numeric_column("Age") 
tenure = tf.feature_column.numeric_column("Tenure") 
balance = tf.feature_column.numeric_column("Balance") 
num_of_products = tf.feature_column.numeric_column("NumOfProducts") 
has_card = tf.feature_column.categorical_column_with_vocabulary_list("HasCrCard", ["True", "False"]) 
is_active_member = tf.feature_column.categorical_column_with_vocabulary_list("IsActiveMember", ["True", "False"]) 
estimated_salary = tf.feature_column.numeric_column("EstimatedSalary") 
feature_columns = [credit_score, age, tenure, balance, num_of_products, has_card, is_active_member, estimated_salary] 

def input_fn(num_epochs=None, shuffle=True, batch_size=100): 
    df = pd.read_csv('Churn_Modelling.csv', 
        names=FEATURES, 
        dtype={'HasCrCard': str, 'IsActiveMember': str}, 
        skipinitialspace=True, 
        header=0) 
    df = df.dropna(how='any', axis=0) # remove NaN elements 
    labels = df["Exited"] 
    return tf.estimator.inputs.pandas_input_fn(x=df, 
              y=labels, 
              batch_size=batch_size, 
              num_epochs=num_epochs, 
              shuffle=shuffle, 
              num_threads=5) 

model = tf.estimator.LinearClassifier(model_dir=None, 
             feature_columns=feature_columns) 
model.train(input_fn=input_fn(), steps=100) 
+0

이 코드가 작동하지 않습니다. 오류가 발생합니다. "SystemError : <내장 함수 TF_Run>이 오류 세트와 함께 결과를 반환했습니다."우리가 다시 작성한 기능 열에 관한 것이 었습니다. feature_columns = tf.contrib.learn.infer_real_valued_columns_from_input_fn (get_input_fn_train()) – TulinCakmak

+0

이 코드가 작동합니다. 내가 말했듯이 당신의'.csv '는 아마 다를 것입니다. 어떤 열과 유형을 가지고 있는지 설명하지 않았으므로 두 열을 제외한 모든 열이 숫자 인 간단한 csv를 만들었습니다. – Maxim