Создание пользовательского оценщика: оценка среднего состояния - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь разработать очень простую начальную модель, чтобы предсказать сумму штрафов, которые может рассчитывать дом престарелых в зависимости от его местоположения.

Это мое определение класса

#initial model to predict the amount of fines a nursing home might expect to pay based on its location
from sklearn.base import BaseEstimator, RegressorMixin, TransformerMixin

class GroupMeanEstimator(BaseEstimator, RegressorMixin):
    #defines what a group is by using grouper
    #initialises an empty dictionary for group averages
    def __init__(self, grouper):
        self.grouper = grouper
        self.group_averages = {}

    #Any calculation I require for my predict method goes here
    #Specifically, I want to groupby the group grouper is set by
    #I want to then find out what is the mean penalty by each group
    #X is the data containing the groups
    #Y is fine_totals
    #map each state to its mean fine_tot
    def fit(self, X, y):
        #Use self.group_averages to store the average penalty by group
        Xy = X.join(y) #Joining X&y together
        state_mean_series = Xy.groupby(self.grouper)[y.name].mean() #Creating a series of state:mean penalties
        #populating a dictionary with state:mean key:value pairs
        for row in state_mean_series.iteritems():
            self.group_averages[row[0]] = row[1]
        return self

    #The amount of fine an observation is likely to receive is based on his group mean
    #Want to first populate the list with the number of observations
    #For each observation in the list, what is his group and then set the likely fine to his group mean.
    #Return the list
    def predict(self, X):
        dictionary = self.group_averages
        group = self.grouper
        list_of_predictions = [] #initialising a list to store our return values
        for row in X.itertuples(): #iterating through each row in X
            prediction = dictionary[row.STATE] #Getting the value from group_averages dict using key row.group
            list_of_predictions.append(prediction)
        return list_of_predictions

Это работает для этого state_model.predict(data.sample(5))

Но ломаетсякогда я пытаюсь это сделать:

1 Ответ

1 голос
/ 07 октября 2019

Проблема, с которой я сталкиваюсь, заключается в вашем fit методе, iteritems в основном перебирает столбцы, а не строки. Вы должны использовать itertuples, который даст вам данные по строкам. просто измените цикл в вашем методе fit на

for row in pd.DataFrame(state_mean_series).itertuples(): #row format is [STATE, mean_value]
    self.group_averages[row[0]] = row[1]

, а затем в вашем методе прогнозирования просто выполните проверку на отказоустойчивость, выполнив

prediction = dictionary.get(row.STATE, None) # None is the default value here in case the 'AS' doesn't exist. you may replace it with what ever you want
...