O Green Peace, em colaboração com universidades dos três continentes do globo, realizou treze tipos de análise nos três principais oceanos a fim de tentar caracterizar o perfil físico-químico de suas águas. Eles acreditam que, dada uma amostra de água, podem identificar sua origem com base nestas treze informações. Considere-se contratado para este trabalho. Ou seja, seu grupo deve ajudar o Green Peace e desenvolver um sistema capaz de realizar a identificação da origem de uma amostra de água do mar.
Propriedade
P1 Água, gelo e vapor: Capacidade térmica e temperaturas de vaporização e fusão
P2 Água, gelo e vapor: Densidade da água
P3 Água, gelo e vapor: Densidade do gelo
P4 Água, gelo e vapor: Miscibilidade e condensação
P5 Água, gelo e vapor: Pressões de vapor da água
P6 Água, gelo e vapor: Compressibilidade
P7 Água, gelo e vapor: Ponto triplo
P8 Água, gelo e vapor: O efeito Mpemba
P9 Água, gelo e vapor: Gelo quente
P10 Tensão superficial
P11 Condutividade elétrica
P12 A natureza bipolar da água: Adesão
P13 A natureza bipolar da água: Tensão superficial
Origem
Atlântico
Pacífico
Índico
In [24]:
import pandas as pd
import numpy as np
from sklearn.cross_validation import cross_val_score
# Setting k for k-fold cross-validation = 10
cross_val_k = 10
In [54]:
X = pd.read_csv('AM_PROBLEMA_ÁGUAOCEANOS_DADOS.txt', sep="\t", header=0, usecols=range(13), thousands=',')
Y = pd.read_csv('AM_PROBLEMA_ÁGUAOCEANOS_DADOS.txt', sep="\t", header=0, usecols=[13], encoding='latin1')
Y = Y.replace({'Pacfico': 0}, regex=True)
Y = Y.replace({'Atlntico': 1}, regex=True)
Y = Y.replace({'êndico': 2}, regex=True)
X = X.values.astype(np.float64)
Y = Y.values[:,0].astype(np.float64)
# If necessary normalize and standardize the data attributes...
from sklearn import preprocessing
# standardize and normalize the data attributes
X_NORMAL = preprocessing.normalize(X)
X_STD = preprocessing.scale(X)
X_NORMAL_STD = preprocessing.scale(X_NORMAL)
In [58]:
U, s, V = np.linalg.svd(X, full_matrices=True)
#print("---------U---------")
#print(U)
print("----------S--------")
print(s)
#print("----------V--------")
#print(V)
Setting SVD rank, removing singular values
In [72]:
s_rank = 12
S = np.zeros(X.shape, dtype=complex)
S[:s_rank, :s_rank] = np.diag(s)[:s_rank, :s_rank]
X_SVD = np.dot(U, np.dot(S, V));
X_SVD = np.real(X_SVD);
In [73]:
# All columns = [0,1,2,3,4,5,6,7,8,9,10,11,12]
used_columns = [1,6,10,11,12]
X_EDITED = X[:, used_columns]
In [74]:
from sklearn.decomposition import KernelPCA
kpca = KernelPCA(n_components=9, kernel='linear')
X_KPCA = kpca.fit_transform(X)
In [75]:
from sklearn import svm
#Penalty parameter C of the error term.
Penalty_C = 1.0 # SVM regularization parameter
In [76]:
poly_svc = svm.SVC(kernel='poly', degree=3, C=Penalty_C)
accuracy_poly_svc = cross_val_score(poly_svc, X_KPCA, Y, cv=cross_val_k, scoring='accuracy').mean()
print('poly_svc', accuracy_poly_svc)
In general, the following Kernels resulted in a worse results than the Polynomial Kernel with degree 3
In [77]:
# SVC with linear kernel
svc = svm.SVC(kernel='linear', C=Penalty_C)
accuracy_svc = cross_val_score(svc, X, Y, cv=cross_val_k, scoring='accuracy').mean()
print('svm linear kernel:', accuracy_svc)
In [78]:
rbf_svc = svm.SVC(kernel='rbf', gamma='auto', C=Penalty_C)
accuracy_rbf_svc = cross_val_score(rbf_svc, X, Y, cv=cross_val_k, scoring='accuracy').mean()
print('rbf_svc', accuracy_rbf_svc)
In [79]:
poly_svc = svm.SVC(kernel='poly', degree=2, C=Penalty_C)
accuracy_poly_svc = cross_val_score(poly_svc, X, Y, cv=cross_val_k, scoring='accuracy').mean()
print('poly_svc', accuracy_poly_svc)
The best classifier we tested was Boosting.
In [62]:
# Gradient Boosting
from sklearn.ensemble import GradientBoostingClassifier
model = GradientBoostingClassifier(n_estimators=50, learning_rate=1.0, max_depth=1, random_state=0)
accuracy_boost = cross_val_score(model, X, Y, cv=cross_val_k, scoring='accuracy').mean()
print('boosting', accuracy_boost)
# AdaBoostClassifier - Worse
# AdaBoostClassifier(svm.SVC(probability=True,kernel='linear'),n_estimators=50, learning_rate=1.0, algorithm='SAMME')
In [43]:
from sklearn.neighbors import KNeighborsClassifier
# Get best k.
k_range = range(1,31)
k_scores = []
for k in k_range:
knn = KNeighborsClassifier(n_neighbors=k)
scores = cross_val_score(knn, X, Y, cv=cross_val_k, scoring='accuracy')
k_scores.append(scores.mean())
#print(k_scores)
max_score = max(k_scores)
print("Best k = " , (k_scores.index(max_score) + 1))
print("Score = " , (max_score ))
In [10]:
import matplotlib.pyplot as plt
%matplotlib inline
plt.plot(k_range, k_scores)
plt.xlabel('Value of k for KNN')
plt.ylabel('Cross-Validated Accuracy')
Out[10]:
In [48]:
from sklearn import tree
dec_tree = tree.DecisionTreeClassifier()
accuracy_dec_tree = cross_val_score(dec_tree, X, Y, cv=cross_val_k, scoring='accuracy')
print('Decision Tree: ', accuracy_dec_tree.mean())
Decision Tree Accuracy: 0.858999828001
In [ ]: