In [3]:
# Ejercicio 1
# Alumnos: Cristhian Rodríguez Gomez y Jesus Perucha Perez
'''
1. Cargar un el conjunto de datos del IRIS data set
'''
# Importamos la libreria ''
from sklearn.datasets import load_iris
data = load_iris()
In [4]:
'''
2. Una vez cargado convertir a pandas
'''
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
iris = load_iris()
data_panda = pd.DataFrame(data=np.c_[iris['data'], iris['target']],
columns= iris['feature_names'] + ['target'])
print(data_panda)
In [5]:
'''
3. Obtener información básica:3
'''
# - Numero de features
features = iris.feature_names
numeroFeatures = len(features)
print('numero de features:',numeroFeatures)
# - Nombre de las features
print('features:', features)
# - Rango de valores del target
target = iris.target
minimo = min(target)
maximo = max(target)
print('Rango -> ','min:',minimo, ' max:', maximo)
# - Valor medio de las features
media_features = np.mean(data_panda)
print('media de las features:','\n',media_features) #mean : hace la media de cada una de las columnas de la tabla
In [6]:
'''
4. Obtener información estadística:
'''
# 4.1 La media de los valores de cada feature, para cada tipo de flor (flor = target)
import numpy as np
target = iris.target
print('<--- Media de los valores de cada feature ')
print('<----', data.target_names[0])
print(np.mean(data_panda[target == 0]))
print('<----', data.target_names[1])
print(np.mean(data_panda[target == 1]))
print('<----', data.target_names[2])
print(np.mean(data_panda[target == 2]))
# 4.2 Los valores de la flor sepal length más grande y más pequeño
# argmax: funcion que devuelve el indice del max
indice_grande = data_panda["sepal length (cm)"].argmax()
# argmin: funcion que devuelve el indice del min
indice_pequeno = data_panda["sepal length (cm)"].argmin()
# Loc: funcion que devulve la fila de (indice) que se le pasa como parametro
fila_grande = data_panda.loc[indice_grande]
fila_pequeno = data_panda.loc[indice_pequeno]
print('<--- Valoress de la flor sepal length más grande ')
print(fila_grande)
print('<--- Valoress de la flor sepal length más pequeño ')
print(fila_pequeno)
In [7]:
'''
5. Obtener la correlación cruzada de todas las features (etiquetas)
'''
data_panda.corr(method='pearson')
data_panda.corr(method='kendall')
Out[7]:
In [41]:
'''
6. Visualiza las con Seaborn Pairplot la correlación de las features
Sirve para poder visualizar las graficas online
'''
%matplotlib inline
# libreria para usar las graficas
import seaborn as sns; sns.set(style="ticks", color_codes=True)
# Mostramos la grafica y pintamos los puntos segun el target
sns.pairplot(data_panda, hue="target")
In [8]:
'''
7. Utiliza train/split y KNN para entrenar un modelo
http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html
- Repítelo para diferentes valores K del, 1 al 50
'''
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import pandas as pd
iris = load_iris()
data_frame = pd.DataFrame( data=np.c_[iris['data'], iris['target']],
columns= iris['feature_names'] + ['target'])
# Lo transformamos en un pandas
X = data_frame[iris['feature_names']] # features
y = data_frame['target'] # targets
print(X.shape) # muestra el numero de filas y columnas
print(y.shape)
# Vamos a entrenar
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=20)
knn.fit(X,y)
# Vamos a predecir las siquientes filas con las siguientes 'features'
fila1 = [1,2,4,4]
fila2 = [5,5,3,1]
fila3 = [0,2,1,3]
knn.predict([fila1, fila2, fila3])
data_frame
Out[8]:
In [63]:
# Vamos a entrenar el algoritmo para algun k (numero de vecinoa)
maximo = 0
minimo = 1
for k in range(1, 50):
knn = KNeighborsClassifier(n_neighbors=k)
# Vamos a dividir nuestros conjuntos (40% para entrenar y 60% para test)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=42)
# entrenamos el algoritmo con el 60% de los datos
knn.fit(X_train,y_train)
# realizamos la prediccion con el otro 40% de los datos
y_pred = knn.predict(X_test)
# Con esta libreria nos dira como de bien esta mi modelo
from sklearn.metrics import accuracy_score
resultado = accuracy_score(y_test, y_pred)
if resultado > maximo:
maximo = resultado
if resultado < minimo:
minimo = resultado
# Mostramos el max y el min
print(maximo)
print(minimo)
#- ¿Cuál es el mejor modelo? ¿Cuál es el peor?
# Mejor -> k = [11-21], 23, [25,30], 32, 34
# Peor -> K = 44
In [46]:
Out[46]:
In [70]:
for k in range(1, 50):
# Modelo
knn = KNeighborsClassifier(n_neighbors=k)
# Vamos a dividir nuestros conjuntos (40% para entrenar y 60% para test)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=42)
# entrenamos el algoritmo con el 60% de los datos
knn.fit(X_train,y_train)
# realizamos la prediccion con el otro 40% de los datos
y_pred = knn.predict(X_test)
# Con esta libreria nos dira como de bien esta mi modelo
from sklearn.metrics import accuracy_score
resultado = accuracy_score(y_test, y_pred)
#- ¿Qué matriz de confusión de da el mejor model? ¿y el peor?
from sklearn.metrics import confusion_matrix
matriz = confusion_matrix(y_test, y_pred)
#print(matriz)
#print(k,"-------------")
# SCORE
scores = cross_val_score(knn, iris.data, iris.target, cv=10)
print(scores)
In [69]:
#Matriz de confusion
from sklearn.metrics import confusion_matrix
confusion_matrix(y_test, y_pred)
Out[69]:
In [61]:
from sklearn import svm
from sklearn.model_selection import cross_val_score
# modelo
clf = svm.SVC(kernel='linear', C=1)
#SCORE
scores = cross_val_score(clf, iris.data, iris.target, cv=10)
print(scores)
# Uno de los mejores 11
In [14]:
from sklearn.externals import joblib
# Guarda el modelo, sea knn, svm(clf)
joblib.dump(knn, 'filename.pkl')
#Carga el modelo
modelo = joblib.load('filename.pkl')
modelo.predict([[1,2,3,4]])
# Uno de los mejores 11
Out[14]:
In [68]:
'''
10. En lugar de KNN utiliza otros métodos y comprueba cual te da mejor score:
- SVM (support vector classification)
- Random Forest
'''
from sklearn.ensemble import RandomForestClassifier
rf1 = RandomForestClassifier(n_estimators=10)
rf2 = rf1.fit(X_train,y_train)
y_pred = rf2.predict(X_test)
# Con esta libreria nos dira como de bien esta mi modelo
from sklearn.metrics import accuracy_score
resultado = accuracy_score(y_test, y_pred)
print(resultado)
scores = cross_val_score(rf2, iris.data, iris.target, cv=10)
print (scores)
# Scores
# + randomForest 5(unos)
# + svm 7(unos)
# + knn 3(unos)