kebincontreras's picture
Update
712ed64 verified
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, f1_score, precision_score, recall_score, confusion_matrix, classification_report
from sklearn.model_selection import train_test_split
# Funci贸n para aplicar Min-Max a cada columna
def min_max_normalize(column):
return (column - column.min()) / (column.max() - column.min())
# Funci贸n para aplicar Normax
def normax_normalize(column):
return column / column.max()
# Cargar el archivo de Excel desde la ruta especificada
file_path = r"C:\Users\USUARIO\Documents\Indonecia\Rice_Spectral.xlsx"
data = pd.read_excel(file_path, sheet_name="Spectral")
# Asegurarse de que los valores de "Location" sean num茅ricos
data['Location'] = pd.to_numeric(data['Location'], errors='coerce')
# Separar los datos de los n煤meros de onda (Wavenumbers)
wavenumbers = data['Location'].dropna() # Eliminar posibles NaN en wavenumbers
# Filtrar las columnas que pertenecen a Java y Bangka Belitung
java_columns = [col for col in data.columns if "Java" in col]
belitung_columns = [col for col in data.columns if "Bangka Belitung" in col]
# Asegurarse de que todas las columnas de datos sean num茅ricas
data[java_columns] = data[java_columns].apply(pd.to_numeric, errors='coerce')
data[belitung_columns] = data[belitung_columns].apply(pd.to_numeric, errors='coerce')
# Aplicar normalizaci贸n Min-Max y Normax
data_minmax = data.copy()
data_normax = data.copy()
data_minmax[java_columns] = data_minmax[java_columns].apply(min_max_normalize)
data_minmax[belitung_columns] = data_minmax[belitung_columns].apply(min_max_normalize)
data_normax[java_columns] = data_normax[java_columns].apply(normax_normalize)
data_normax[belitung_columns] = data_normax[belitung_columns].apply(normax_normalize)
# Preparar los datos para PCA y t-SNE
all_columns = java_columns + belitung_columns
# Normalizaci贸n de datos (Min-Max)
spectral_data_minmax = data_minmax[all_columns].dropna().transpose()
# Estandarizaci贸n de datos
scaler = StandardScaler()
spectral_data_standardized = scaler.fit_transform(spectral_data_minmax)
# Calcular el valor m谩ximo permitido para n_components
n_samples, n_features = spectral_data_minmax.shape
n_components = min(n_samples, n_features)
# PCA para reducir a un m谩ximo de n_components antes de t-SNE
pca_50_standardized = PCA(n_components=n_components).fit_transform(spectral_data_standardized)
# t-SNE despu茅s de reducir a n_components con PCA
tsne_standardized = TSNE(n_components=2, random_state=42).fit_transform(pca_50_standardized)
# Asignar etiquetas a las muestras: 0 para Java y 1 para Bangka Belitung
labels = [0] * len(java_columns) + [1] * len(belitung_columns)
# Dividir los datos t-SNE en entrenamiento y prueba
X_train, X_test, y_train, y_test = train_test_split(tsne_standardized, labels, test_size=0.3, random_state=42)
# Entrenar un modelo SVM
svm_model = SVC(kernel='linear')
svm_model.fit(X_train, y_train)
# Realizar predicciones
y_pred = svm_model.predict(X_test)
# Calcular las m茅tricas
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)
class_report = classification_report(y_test, y_pred)
# Mostrar resultados
print(f"Accuracy: {accuracy * 100:.2f}%")
print(f"Precision: {precision:.2f}")
print(f"Recall: {recall:.2f}")
print(f"F1-Score: {f1:.2f}")
print("\nMatriz de Confusi贸n:")
print(conf_matrix)
print("\nReporte de Clasificaci贸n:")
print(class_report)
# Visualizaci贸n de la matriz de confusi贸n
plt.figure(figsize=(6, 4))
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=['Java', 'Bangka Belitung'], yticklabels=['Java', 'Bangka Belitung'])
plt.title('Matriz de Confusi贸n')
plt.ylabel('Etiqueta Real')
plt.xlabel('Etiqueta Predicha')
plt.show()