Proyecto Mineria de Datos
Fernando Moreno Gómez
Data set Adult
Barry Becker realizó la extracción de la base de datos del censo de 1994. Se extrajo un conjunto de registros razonablemente limpios utilizando las siguientes condiciones:
- edad > 16
- fnlwgt > 1
- horas por semana>0
Objetivo
Determinar si una persona gana más de 50 mil al año.
Analisis del data set
Porcentaje de salarios
La figura 1 muestra el porcentaje de personas que ganan <=50K y >50K
figura 1. Porcentaje de salarios del data set
Porcentaje de salario
Figura 2. Porcentaje de salario por sexo.
Distribución de edad, fnlwgt, educación, ganancia, perdida y hrs por semana.
Matriz de correlación
Análisis de anomalias
El paso más importante
Disminuir la cantidad de categorías por columna
categorias={'workclass':{'gov':['State-gov','Local-gov','Federal-gov']},
'education':{'pre-college':['5th-6th','11th','10th','1st-4th',
'12th','7th-8th','9th','Preschool'],
'assoc':['Assoc-acdm','Assoc-voc'],
'HS-grad':['Doctorate','HS-grad','Masters']},
'marital.status':{'single':['Never-married','Divorced','Widowed',
'Married-spouse-absent', 'Separated']},
'occupation':{'other':['Other-service','Priv-house-serv']},
'native.country':{'countrys':nc}}
def preprocesamiento(df):
df['capital.gain'] = df['capital.gain'].apply(lambda x: np.log(x + 1))
df['capital.loss'] = df['capital.loss'].apply(lambda x: np.log(x + 1))
colC = (df.describe(include=np.object).columns)
columnsC = colC.tolist()
for c in columnsC:
df[c] = df[c].astype('category')
df[c] = df[c].cat.codes
if len(list(df.keys()))>12:
income_raw = df['income']
income = income_raw.apply(lambda x: 1 if x == 1 else 0)
df['income'] = income
return df
¿Qué algoritmos utilizamos?
- Árbol de decisión
- Adaboost
def treeModel(df):
X= df.drop('income', axis=1)
y = df['income']
oversample = SMOTE()
X, y = oversample.fit_resample(X, y)
Xtrain, Xtest, ytrain, ytest =train_test_split(X,y,stratify=y)
b_tree = DecisionTreeClassifier(criterion='entropy',max_depth=20,
splitter='random',max_features=12,
min_samples_split=6)
b_tree.fit(x,y)
y_pred = b_tree.predict(Xtrain)
y_predT = b_tree.predict(Xtest)
f1_t = f1_score(ytrain,y_pred,average='weighted')
f1_e = f1_score(ytest,y_predT,average='weighted')
at = accuracy_score(ytrain,y_pred)
ae = accuracy_score(ytest,y_predT)
return {'f1_t':f1_t,'f1_e':f1_e,'at':at,'ae':ae}
def adaboostTree(df):
X = df.drop('income', axis=1)
y = df['income']
oversample = SMOTE()
X, y = oversample.fit_resample(X, y)
Xtrain, Xtest, ytrain, ytest =train_test_split(X,y,stratify=y)
b_tree = DecisionTreeClassifier(criterion='entropy',max_depth=8,
min_samples_leaf=5,min_samples_split=10)
clf = AdaBoostClassifier(b_tree,learning_rate=0.09,
n_estimators=1000, algorithm='SAMME')
clf.fit(Xtrain,ytrain)
y_pred = clf.predict(Xtrain)
y_predT = clf.predict(Xtest)
f1_t = f1_score(ytrain,y_pred,average='weighted')
f1_e = f1_score(ytest,y_predT,average='weighted')
at = accuracy_score(ytrain,y_pred)
ae = accuracy_score(ytest,y_predT)
return {'f1_t':f1_t,'f1_e':f1_e,'at':at,'ae':ae}
Resultados
Resultados de arbol de decisión.
Tabla de resultados con Adaboost
Alternativas
Conclusiones
Trabajo a futuro
Gracias !!!
Proyecto Mineria de datos Fernando Moreno
By Fernando Moreno Gomez
Proyecto Mineria de datos Fernando Moreno
- 134