Beruflich Dokumente
Kultur Dokumente
In [4]: data.shape
In [69]: data.head(10)
1
7 0.92 0.85 5 259
8 0.89 1.00 5 224
9 0.42 0.53 2 142
salary
0 low
1 medium
2 medium
3 low
4 low
5 low
6 low
7 low
8 low
9 low
In [71]: data.tail()
2
14997 0 support low
14998 0 support low
DataTypes
satisfaction_level float64
last_evaluation float64
number_project int64
average_montly_hours int64
time_spend_company int64
Work_accident int64
left int64
promotion_last_5years int64
sales object
salary object
3
max 1.000000
Name: left, dtype: float64
In [8]: data.left.hist()
plt.title('Empleados que han dejado la compañía')
plt.xlabel('0 = No , 1 = Sí')
plt.ylabel('Número de empleados')
plt.show()
In [9]: data.left.value_counts()
Out[9]: 0 11428
1 3571
Name: left, dtype: int64
Out[10]: 0 0.761917
1 0.238083
Name: left, dtype: float64
4
0.4.2 Separación de variable a predecir
In [11]: empl = data.drop('left', axis=1)
In [12]: empl.columns
In [13]: le = preprocessing.LabelEncoder()
empl.sales = le.fit_transform(empl.sales)
Salary
In [17]: empl
5
19 0.76 0.89 5
20 0.11 0.83 6
21 0.38 0.55 2
22 0.09 0.95 6
23 0.46 0.57 2
24 0.40 0.53 2
25 0.89 0.92 5
26 0.82 0.87 4
27 0.40 0.49 2
28 0.41 0.46 2
29 0.38 0.50 2
... ... ... ...
14969 0.43 0.46 2
14970 0.78 0.93 4
14971 0.39 0.45 2
14972 0.11 0.97 6
14973 0.36 0.52 2
14974 0.36 0.54 2
14975 0.10 0.79 7
14976 0.40 0.47 2
14977 0.81 0.85 4
14978 0.40 0.47 2
14979 0.09 0.93 6
14980 0.76 0.89 5
14981 0.73 0.93 5
14982 0.38 0.49 2
14983 0.72 0.84 5
14984 0.40 0.56 2
14985 0.91 0.99 5
14986 0.85 0.85 4
14987 0.90 0.70 5
14988 0.46 0.55 2
14989 0.43 0.57 2
14990 0.89 0.88 5
14991 0.09 0.81 6
14992 0.40 0.48 2
14993 0.76 0.83 6
14994 0.40 0.57 2
14995 0.37 0.48 2
14996 0.37 0.53 2
14997 0.11 0.96 6
14998 0.37 0.52 2
6
4 159 3 0
5 153 3 0
6 247 4 0
7 259 5 0
8 224 5 0
9 142 3 0
10 135 3 0
11 305 4 0
12 234 5 0
13 148 3 0
14 137 3 0
15 143 3 0
16 160 3 0
17 255 6 0
18 160 3 1
19 262 5 0
20 282 4 0
21 147 3 0
22 304 4 0
23 139 3 0
24 158 3 0
25 242 5 0
26 239 5 0
27 135 3 0
28 128 3 0
29 132 3 0
... ... ... ...
14969 157 3 0
14970 225 5 0
14971 140 3 0
14972 310 4 0
14973 143 3 0
14974 153 3 0
14975 310 4 0
14976 136 3 0
14977 251 6 0
14978 144 3 0
14979 296 4 0
14980 238 5 0
14981 162 4 0
14982 137 3 0
14983 257 5 0
14984 148 3 0
14985 254 5 0
14986 247 6 0
14987 206 4 0
14988 145 3 0
14989 159 3 1
7
14990 228 5 1
14991 257 4 0
14992 155 3 0
14993 293 6 0
14994 151 3 0
14995 160 3 0
14996 143 3 0
14997 280 4 0
14998 158 3 0
8
14975 0 2 0 0
14976 0 2 0 0
14977 0 2 0 0
14978 0 2 0 0
14979 0 2 0 0
14980 0 3 0 0
14981 0 1 0 0
14982 0 2 0 0
14983 0 2 0 0
14984 0 2 0 0
14985 0 2 0 0
14986 0 1 0 0
14987 0 1 0 0
14988 0 1 0 0
14989 0 1 0 0
14990 0 1 0 0
14991 0 1 0 0
14992 0 1 0 0
14993 0 1 0 0
14994 0 1 0 0
14995 0 1 0 0
14996 0 1 0 0
14997 0 1 0 0
14998 0 1 0 0
9
22 0 0 0 0
23 0 0 0 0
24 0 0 0 0
25 0 0 0 0
26 0 0 0 0
27 0 0 0 0
28 1 0 0 0
29 1 0 0 0
... ... ... ... ...
14969 0 0 0 0
14970 0 0 0 0
14971 0 0 0 0
14972 1 0 0 0
14973 1 0 0 0
14974 1 0 0 0
14975 0 1 0 0
14976 0 1 0 0
14977 0 1 0 0
14978 0 1 0 0
14979 0 0 0 0
14980 0 0 0 0
14981 0 0 0 0
14982 0 0 0 0
14983 0 0 0 0
14984 0 0 0 0
14985 0 0 0 0
14986 0 0 0 0
14987 0 0 0 0
14988 0 0 0 0
14989 0 0 0 0
14990 0 0 0 0
14991 0 0 0 0
14992 0 0 0 0
14993 0 0 0 0
14994 0 0 0 0
14995 0 0 0 0
14996 0 0 0 0
14997 0 0 0 0
14998 0 0 0 0
10
7 0 1 0 0
8 0 1 0 0
9 0 1 0 0
10 0 1 0 0
11 0 1 0 0
12 0 1 0 0
13 0 1 0 0
14 0 1 0 0
15 0 1 0 0
16 0 1 0 0
17 0 1 0 0
18 0 1 0 0
19 0 1 0 0
20 0 1 0 0
21 0 1 0 0
22 0 1 0 0
23 0 1 0 0
24 0 1 0 0
25 0 1 0 0
26 0 1 0 0
27 0 1 0 0
28 0 0 0 0
29 0 0 0 0
... ... ... ... ...
14969 0 1 0 0
14970 0 1 0 0
14971 0 1 0 0
14972 0 0 0 0
14973 0 0 0 0
14974 0 0 0 0
14975 0 0 0 0
14976 0 0 0 0
14977 0 0 0 0
14978 0 0 0 0
14979 0 0 0 1
14980 0 0 0 1
14981 0 0 0 1
14982 0 0 0 1
14983 0 0 0 1
14984 0 0 0 1
14985 0 0 0 1
14986 0 0 0 1
14987 0 0 0 1
14988 0 0 0 1
14989 0 0 0 1
14990 0 0 1 0
14991 0 0 1 0
14992 0 0 1 0
11
14993 0 0 1 0
14994 0 0 1 0
14995 0 0 1 0
14996 0 0 1 0
14997 0 0 1 0
14998 0 0 1 0
1 Selección de variables
1.1 Criterio de la varianza
In [18]: varianza = np.var(empl, axis =0)
plt.bar(np.arange(len(varianza)),varianza)
plt.title('Varianza de las variables')
plt.ylabel('varianza')
plt.show()
In [19]: empl['average_montly_hours'].hist()
plt.show()
12
Como se puede observar, el numero de horas promedio trabajadas mensualmente tiene mucha
varianza a comparación de las otras variables , por lo cual , no influye en la clasificación de los
datos y la excluiremos de la separación de variables.
13
In [21]: varianza
La única variable a eliminar será average_montly_hours, debido a que las demás variables
estan en un rango aceptable , de 0 a 2.
14
1.2 Criterio de correlación
In [22]: plt.matshow(empl.corr())
plt.show()
Hay una correlación entre las primeras 5 variables existe una correlación mayor.
Accu = np.zeros(grados.shape)
Prec = np.zeros(grados.shape)
Reca = np.zeros(grados.shape)
F1 = np.zeros(grados.shape)
Nvar = np.zeros(grados.shape)
poly = PolynomialFeatures(ngrado)
Xa = poly.fit_transform(X)
logreg = LogisticRegression(C=1)
logreg.fit(Xa,Y)
15
Yg = logreg.predict(Xa)
Accu[ngrado-1] = accuracy_score(Y,Yg)
Prec[ngrado-1] = precision_score(Y,Yg)
Reca[ngrado-1] = recall_score(Y,Yg)
F1[ngrado-1] = f1_score(Y,Yg)
Nvar[ngrado-1] = len(logreg.coef_[0])
plt.plot(grados,Accu)
plt.plot(grados,Prec)
plt.plot(grados,Reca)
plt.plot(grados,F1)
plt.xlabel('Grado del Polinomio')
plt.legend(('Accuracy','Precision','Recall','F1'),loc='best')
plt.ylabel('%')
plt.grid()
plt.show()
Nos damos cuenta que mediante la grafica inferimos que el mejor grado del polinomio es el 2
ya que despues de este el accuracy, recall y F1 se mantienen similares, lo que significa que le dan
mayor peso computacional sin mejorar las proyeccciones del modelo.
16
accu = accuracy_score(Y,Yg)
prec = precision_score(Y,Yg)
reca = recall_score(Y,Yg)
f1 = f1_score(Y,Yg)
Nvar = len(logreg.coef_[0])
In [26]: accu
Out[26]: 0.83125541702780181
In [27]: prec
Out[27]: 0.72413793103448276
In [28]: reca
Out[28]: 0.47045645477457293
In [29]: f1
Out[29]: 0.57036156849431341
Interpretación : El modelo de regresión logística tiene un poder de proyección bajo, por lo cual,
ahora se aplicará el modelo SVM.
2.0.1 SVM
In [33]: clf = svm.SVC(kernel = 'rbf') # Gausseano
clf.fit(X,Y)
Out[33]: SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape=None, degree=3, gamma='auto', kernel='rbf',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)
In [34]: Yg = clf.predict(X)
Accuracy = accuracy_score(Y,Yg)
Precision = precision_score(Y,Yg)
Recall = recall_score(Y,Yg)
F1 = f1_score(Y,Yg)
In [35]: print(Accuracy)
print(Precision)
print(Recall)
print(F1)
0.956997133142
0.899945325314
0.921870624475
0.910776040946
Es necesario arreglar este modelo ya que hay un overfitting, es decir, que el modelo está aju-
stando a los datos de entrenamiento. Las métricas se están obteniendo con los mismos datos de
entrenamiento.
17
2.1 Arreglar overfitting
A continuación se separaran los datos, una parte de ellos sera utilizada para entrenar el modelo,
y con la parte restante, se aplicará la prueba del modelo para ver si las predicciones con datos que
el modelo nunca ha visto, son buenos.
In [74]: X_train.shape
In [62]: X_test.shape
In [64]: Yg = clf.predict(X_test)
Accuracy = accuracy_score(y_test,Yg)
Precision = precision_score(y_test,Yg)
Recall = recall_score(y_test,Yg)
F1 = f1_score(y_test,Yg)
In [65]: print(Accuracy)
print(Precision)
print(Recall)
print(F1)
0.947333333333
0.874045801527
0.907187323147
0.890308247709
Al aplicar el nuevo modelo de SVM, que incluso con datos que nunca ha visto las metricas
bajan muy poco. Con esto concluimos que nuestro modelo es lo suficiente bueno.
18