iris-kmeansklearn.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. # https://pythonru.com/uroki/sklearn-kmeans-i-knn
  2. # https://gitlab.com/PythonRu/notebooks/-/blob/master/classified_data.csv
  3. import numpy as np
  4. import pandas as pd
  5. import matplotlib.pyplot as plt
  6. import seaborn as sns
  7. from sklearn.preprocessing import StandardScaler
  8. from sklearn.model_selection import train_test_split
  9. from sklearn.neighbors import KNeighborsClassifier
  10. from sklearn.metrics import classification_report
  11. from sklearn.metrics import confusion_matrix
  12. raw_data = pd.read_csv('iris.csv')
  13. print(raw_data.head())
  14. y = raw_data['variety']
  15. raw_data = raw_data.drop(["variety"], axis = 1)
  16. print(raw_data.head())
  17. scaler = StandardScaler()
  18. scaler.fit(raw_data)
  19. scaled_features = scaler.transform(raw_data)
  20. scaled_data = pd.DataFrame(scaled_features, columns = raw_data.columns)
  21. x = scaled_data
  22. x_training_data, x_test_data, y_training_data, y_test_data = train_test_split(x, y, test_size = 0.3)
  23. model = KNeighborsClassifier(n_neighbors = 1)
  24. model.fit(x_training_data, y_training_data)
  25. predictions = model.predict(x_test_data)
  26. # print(predictions)
  27. print(classification_report(y_test_data, predictions))
  28. print(confusion_matrix(y_test_data, predictions))
  29. # # # Вывод:
  30. # [[17 0 0]
  31. # [ 0 13 2]
  32. # [ 0 2 11]]
  33. # # '''
  34. # # Выбор оптимального значения для K с помощью метода «Локтя»
  35. # # '''
  36. error_rates = []
  37. for i in np.arange(1, 101):
  38. new_model = KNeighborsClassifier(n_neighbors = i)
  39. new_model.fit(x_training_data, y_training_data)
  40. new_predictions = new_model.predict(x_test_data)
  41. error_rates.append(np.mean(new_predictions != y_test_data))
  42. plt.plot(error_rates)
  43. plt.grid()
  44. plt.show()
  45. # '''
  46. # Как видно из графика, мы достигаем минимальной частоты ошибок при значении K,
  47. # равном приблизительно 15. Это означает, что 35 является подходящим выбором для K,
  48. # который сочетает в себе простоту и точность предсказаний.
  49. # '''
  50. model = KNeighborsClassifier(n_neighbors = 15)
  51. model.fit(x_training_data, y_training_data)
  52. predictions = model.predict(x_test_data)
  53. print(predictions)
  54. print(classification_report(y_test_data, predictions))
  55. print(confusion_matrix(y_test_data, predictions))