Coursera | Aprendizaje automático aplicado en Python (Universidad de Michigan) | Tarea 4

   Todos los enlaces relacionados con la tarea:
  Coursera | Aprendizaje automático aplicado en Python (Universidad de Michigan) | Asignación1
  Coursera | Aprendizaje automático aplicado en Python (Universidad de Michigan) | Asignación2
  Coursera | Aprendizaje automático aplicado en Python (Universidad de Michigan) | Asignación3
  Coursera | Aplicado Aprendizaje automático en Python (Universidad de Michigan) | Tarea4
   Ponga todo el código en github cuando tenga tiempo (demanda)
   Oye, por cierto, promueva su propio blog y los artículos futuros de CSDN se publicarán en su propio blog.

Coursera | Aprendizaje automático aplicado en Python (Universidad de Michigan) | Tarea 4

   Sigue hablando, esto no es difícil, pero tomó mucho tiempo cumplir con los requisitos. Todo el mundo es una referencia ~


Actualmente está viendo la versión 1.1 de este portátil. Para descargar cuadernos y archivos de datos, así como obtener ayuda sobre los cuadernos de Jupyter en la plataforma Coursera, visite el recurso del curso de preguntas frecuentes sobre Jupyter Notebook .


Tarea 4: Comprensión y predicción de las multas por mantenimiento de la propiedad

Esta tarea se basa en un desafío de datos del Equipo de ciencia de datos de Michigan ( MDST ).

El Equipo de Ciencia de Datos de Michigan ( MDST ) y el Simposio Estudiantil de Ciencias Estadísticas Interdisciplinarias de Michigan ( MSSISS ) se han asociado con la Ciudad de Detroit para ayudar a resolver uno de los problemas más urgentes que enfrenta Detroit: la plaga. La ciudad emite violaciones de plaga a las personas que permiten que sus propiedades permanezcan en condiciones de deterioro. Cada año, la ciudad de Detroit emite millones de dólares en multas a los residentes y cada año, muchas de estas multas siguen sin pagarse. Hacer cumplir las multas por plagas no pagadas es un proceso costoso y tedioso, por lo que la ciudad quiere saber: ¿cómo podemos aumentar el cumplimiento de las multas por plagas?

El primer paso para responder a esta pregunta es comprender cuándo y por qué un residente podría no cumplir con una multa por plaga. Aquí es donde entra en juego el modelado predictivo. Para esta tarea, su tarea es predecir si una multa determinada se pagará a tiempo.

Todos los datos para esta asignación nos han sido proporcionados a través del Portal de Datos Abiertos de Detroit . Solo los datos que ya están incluidos en su directorio de Coursera se pueden usar para entrenar el modelo para esta tarea. No obstante, lo alentamos a buscar datos de otros conjuntos de datos de Detroit para ayudar a informar la creación de características y la selección de modelos. Recomendamos echar un vistazo a los siguientes conjuntos de datos relacionados:


Le proporcionamos dos archivos de datos para usar en el entrenamiento y la validación de sus modelos: train.csv y test.csv. Cada fila de estos dos archivos corresponde a un solo boleto de plaga e incluye información sobre cuándo, por qué y a quién se emitió cada boleto. La variable objetivo es el cumplimiento, que es Verdadero si el boleto se pagó antes, a tiempo o dentro de un mes de los datos de la audiencia, Falso si el boleto se pagó después de la fecha de la audiencia o no, y Nulo si se encontró al infractor no responsable. El cumplimiento, así como un puñado de otras variables que no estarán disponibles en el momento de la prueba, solo se incluyen en train.csv.

Nota: Todas las multas en las que los infractores no fueron responsables no se consideran durante la evaluación. Se incluyen en el conjunto de capacitación como una fuente adicional de datos para la visualización y para permitir enfoques no supervisados ​​y semi-supervisados. Sin embargo, no se incluyen en el conjunto de prueba.


Descripciones de archivos (¡Utilice solo estos datos para entrenar su modelo!)

readonly/train.csv - the training set (all tickets issued 2004-2011)
readonly/test.csv - the test set (all tickets issued 2012-2016)
readonly/addresses.csv & readonly/latlons.csv - mapping from ticket id to addresses, and from addresses to lat/lon coordinates. 
 Note: misspelled addresses may be incorrectly geolocated.

Campos de información

train.csv y test.csv

ticket_id - unique identifier for tickets
agency_name - Agency that issued the ticket
inspector_name - Name of inspector that issued the ticket
violator_name - Name of the person/organization that the ticket was issued to
violation_street_number, violation_street_name, violation_zip_code - Address where the violation occurred
mailing_address_str_number, mailing_address_str_name, city, state, zip_code, non_us_str_code, country - Mailing address of the violator
ticket_issued_date - Date and time the ticket was issued
hearing_date - Date and time the violator's hearing was scheduled
violation_code, violation_description - Type of violation
disposition - Judgment and judgement type
fine_amount - Violation fine amount, excluding fees
admin_fee - $20 fee assigned to responsible judgments

state_fee - tarifa de $ 10 asignada a los juicios responsables
late_fee - tarifa del 10% asignada a los juicios responsables
discount_amount - descuento aplicado, si se aplica algún
clean_up_cost - costo de limpieza de DPW o eliminación de grafiti juicio_amount
- Suma de todas las multas y tarifas
grafitti_status - Marcar por violaciones de grafiti

train.csv solamente

payment_amount - Amount paid, if any
payment_date - Date payment was made, if it was received
payment_status - Current payment status as of Feb 1 2017
balance_due - Fines and fees still owed
collection_status - Flag for payments in collections
compliance [target variable for prediction] 
 Null = Not responsible
 0 = Responsible, non-compliant
 1 = Responsible, compliant
compliance_detail - More information on why each ticket was marked compliant or non-compliant

Evaluación

Sus predicciones se darán como la probabilidad de que la multa correspondiente se pague a tiempo.

La métrica de evaluación para esta asignación es el área bajo la curva ROC (AUC).

Su calificación se basará en la puntuación AUC calculada para su clasificador. Un modelo que con un AUROC de 0,7 apruebe esta asignación, más de 0,75 recibirá todos los puntos.


Para esta asignación, cree una función que entrene un modelo para predecir el cumplimiento de las multas por plagas en Detroit usando readonly/train.csv. Usando este modelo, devuelva una serie de longitud 61001 con datos como la probabilidad de que readonly/test.csvse pague cada boleto correspondiente y el índice sea el ticket_id.

Ejemplo:

ticket_id
   284932    0.531842
   285362    0.401958
   285361    0.105928
   285338    0.018572
             ...
   376499    0.208567
   376500    0.818759
   369851    0.018528
   Name: compliance, dtype: float32

Sugerencias

  • Asegúrese de que su código esté funcionando antes de enviarlo al autograder.

  • Imprima su resultado para ver si hay algo extraño (por ejemplo, todas las probabilidades son iguales).

  • Generalmente, el tiempo de ejecución total debe ser inferior a 10 minutos. NO debe utilizar clasificadores relacionados con la red neuronal (por ejemplo, MLPClassifier) ​​en esta pregunta.

  • Intente evitar las variables globales. Si tiene otras funciones además de blight_model, debe mover esas funciones dentro del alcance de blight_model.

  • Consulte los hilos anclados en el foro de discusión de la Semana 4 cuando haya algo que no pudo resolver.

Código

import pandas as pd
import numpy as np
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.svm import SVC
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_curve, auc
from sklearn.metrics import roc_auc_score
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import GridSearchCV

def blight_model():
    # Load and clean data
    train_data = pd.read_csv('train.csv', encoding = 'ISO-8859-1')
    test_data = pd.read_csv('test.csv')
    address =  pd.read_csv('addresses.csv')
    latlons = pd.read_csv('latlons.csv')
    address_lalo = address.set_index('address').join(latlons.set_index('address'), how='left').dropna().reset_index(drop=False)
    
    train_data=pd.merge(train_data, address_lalo, on='ticket_id').set_index('ticket_id')
    test_data=pd.merge(test_data, address_lalo, on='ticket_id',how='left').set_index('ticket_id')
    test_data['lat'].fillna(method='pad', inplace=True)
    test_data['lon'].fillna(method='pad', inplace=True)
    
    train_data = train_data[(train_data['compliance'] == 0) | (train_data['compliance'] == 1)]
    train_data['compliance']=train_data['compliance'].astype(int)
    
    # Calculate time gap
    from datetime import datetime
    def time_gap(hearing_date_str, ticket_issued_date_str):
        if not hearing_date_str or type(hearing_date_str)!=str: return 73
        hearing_date = datetime.strptime(hearing_date_str, "%Y-%m-%d %H:%M:%S")
        ticket_issued_date = datetime.strptime(ticket_issued_date_str, "%Y-%m-%d %H:%M:%S")
        gap = hearing_date - ticket_issued_date
        return gap.days
    train_data['time_gap'] = train_data.apply(lambda row: time_gap(row['hearing_date'], row['ticket_issued_date']), axis=1)
    test_data['time_gap'] = test_data.apply(lambda row: time_gap(row['hearing_date'], row['ticket_issued_date']), axis=1)
    
    # Reomove train only columns
    trainOnly_columns = [
        'payment_amount', 'payment_date', 'payment_status', 'balance_due',
        'collection_status', 'compliance_detail'
    ]
    train_data.drop(trainOnly_columns, axis=1, inplace=True)
    
    # Feature used to train
    feature_columns = [
        'agency_name',
        'violation_street_name',
        'state',
        'violation_code',
        'late_fee',
        'fine_amount',
        'discount_amount',
        'judgment_amount',
        'lat',
        'lon',
        'time_gap'#'ticket_issued_date', 'hearing_date'
    ]

    convert_columns = {
    
    
        'agency_name':'category',
        'violation_street_name':'category',
        'state':'category',
        'violation_code':'category',
        'disposition':'category',
    }
    
    for df in [train_data,test_data]:
        for col, col_type in convert_columns.items():
            if col in df:
                if col_type == 'category':
                    df[col] = df[col].astype(col_type)
                    
    # Convert cetegory columns to integers
    cat_columns = train_data.select_dtypes(['category']).columns
    for df in [train_data,test_data]:
        df[cat_columns] = df[cat_columns].apply(lambda x: x.cat.codes)

    # Spilt
    X = train_data[feature_columns].copy()
    y = train_data['compliance']
    X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
    

    test = test_data[feature_columns].copy()
    
    # Train the model
    GBC = GradientBoostingClassifier(learning_rate = 0.1, max_depth = 5, random_state = 0).fit(X_train, y_train)
    
    y_score_GBC = GBC.decision_function(X_test)
    fpr_GBC, tpr_GBC, _ = roc_curve(y_test, y_score_GBC)
    roc_auc_GBC  = auc(fpr_GBC, tpr_GBC)
    accuracy_GBC = GBC.score(X_test, y_test)
    print("accuracy = {:.4f}   AUC = {:.4f}".format(accuracy_GBC,  roc_auc_GBC))
    
    y_proba = GBC.predict_proba(test)[:,1]
    test['compliance'] = y_proba
    
    return test['compliance']

    
    # Another way
    #     grid_values = {'learning_rate': [0.01, 0.1], 'max_depth': [3, 5]}
    #     clf = GradientBoostingClassifier(random_state = 0)
    #     grid_clf_auc = GridSearchCV(clf, param_grid = grid_values, scoring = 'roc_auc')
    #     grid_clf_auc.fit(X_train, y_train)

    #     probs = grid_clf_auc.predict_proba(test)[:, 1]
    #     result = pd.Series(probs, index=test.index)

    #     return result
blight_model()
accuracy = 0.9346   AUC = 0.7943

ticket_id
284932    0.085164
285362    0.017509
285361    0.071615
285338    0.081694
285346    0.093148
            ...   
376496    0.018970
376497    0.018970
376499    0.071046
376500    0.071046
369851    0.294378
Name: compliance, Length: 61001, dtype: float64

Resultado de AutoGrader


Su AUC de 0.787592334899 recibió un valor de 1.0 de 1.0 calificaciones totales

Supongo que te gusta

Origin blog.csdn.net/weixin_43360896/article/details/111084033
Recomendado
Clasificación