1. 程式人生 > >【機器學習】鳶尾花資料探索

【機器學習】鳶尾花資料探索

# 匯入必要的處理包
from pandas import read_csv
from pandas.plotting import scatter_matrix
from matplotlib import pyplot
from sklearn.model_selection import train_test_split
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.metrics import classification_report
from
sklearn.metrics import confusion_matrix from sklearn.metrics import accuracy_score from sklearn.linear_model import LogisticRegression from sklearn.tree import DecisionTreeClassifier from sklearn.discriminant_analysis import LinearDiscriminantAnalysis from sklearn.neighbors import KNeighborsClassifier from
sklearn.naive_bayes import GaussianNB from sklearn.svm import SVC
# 匯入資料
filename = './data/iris.data.csv'
names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class']
dataset = read_csv(filename, names=names) # 這個資料集沒有頭部,手動指定即可
print(dataset.head())
   sepal-length  sepal-width  petal-length  petal-width        class
0           5.1          3.5           1.4          0.2  Iris-setosa
1           4.9          3.0           1.4          0.2  Iris-setosa
2           4.7          3.2           1.3          0.2  Iris-setosa
3           4.6          3.1           1.5          0.2  Iris-setosa
4           5.0          3.6           1.4          0.2  Iris-setosa

現在開始對資料進行審查,加深對資料的瞭解。

牽涉到如下幾個維度:

  • 資料的維度
  • 資料自身
  • 所有的資料特徵
  • 資料的分佈情況
print(dataset.shape)
(150, 5)
# 檢視資料自身
print(dataset.head(10))
   sepal-length  sepal-width  petal-length  petal-width        class
0           5.1          3.5           1.4          0.2  Iris-setosa
1           4.9          3.0           1.4          0.2  Iris-setosa
2           4.7          3.2           1.3          0.2  Iris-setosa
3           4.6          3.1           1.5          0.2  Iris-setosa
4           5.0          3.6           1.4          0.2  Iris-setosa
5           5.4          3.9           1.7          0.4  Iris-setosa
6           4.6          3.4           1.4          0.3  Iris-setosa
7           5.0          3.4           1.5          0.2  Iris-setosa
8           4.4          2.9           1.4          0.2  Iris-setosa
9           4.9          3.1           1.5          0.1  Iris-setosa
# 統計資料描述資料
print(dataset.describe())
       sepal-length  sepal-width  petal-length  petal-width
count    150.000000   150.000000    150.000000   150.000000
mean       5.843333     3.054000      3.758667     1.198667
std        0.828066     0.433594      1.764420     0.763161
min        4.300000     2.000000      1.000000     0.100000
25%        5.100000     2.800000      1.600000     0.300000
50%        5.800000     3.000000      4.350000     1.300000
75%        6.400000     3.300000      5.100000     1.800000
max        7.900000     4.400000      6.900000     2.500000
print(dataset.groupby('class').size())
class
Iris-setosa        50
Iris-versicolor    50
Iris-virginica     50
dtype: int64

可以看出資料的分佈很均勻,如果分佈不均勻,則會影響到模型的準確度。 如果不均勻,則需要對資料進行處理,使得資料達到相對均勻的狀態。方法有:

  • 擴大資料樣本
  • 資料的重新取樣
  • 生成人工樣本
  • 異常檢測,變化檢測

資料視覺化

圖表分成兩大類:

  • 單變數圖表:理解每個特徵屬性
  • 多變數圖表:理解不同特徵屬性之間的關係
dataset.plot(kind='box', subplots=True, layout=(2,2), sharex=False, sharey=False)
pyplot.show()

在這裡插入圖片描述

dataset.hist()
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x115f1f748>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x1161c5400>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x1165a1080>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x1165dcbe0>]],
      dtype=object)

在這裡插入圖片描述

# 多變數圖表
scatter_matrix(dataset) # 這個工具很好用,單變數的直方圖 + 變數間的散點分佈圖
pyplot.show()

在這裡插入圖片描述

演算法評估

使用不同的演算法來建立模型,並評估它們的準確度。主要有如下幾個步驟:

  • 分離出評估資料集
  • 10折交叉評估驗證演算法模型
  • 生成6個不同的模型來預測新資料
  • 選擇最優模型
# 分離資料集
array = dataset.values
X = array[:,0:4] # 輸入特徵,0-1-2-3
Y = array[:, 4]
validation_size = 0.2
seed = 7 # 隨機數種子
X_train, X_validation, Y_train, Y_validation = train_test_split(X,Y, test_size=validation_size, random_state=seed)
X_train.shape
(120, 4)
Y_train.shape
(120,)

使用6種模型

線性演算法:

  • LR,線性迴歸
  • LDA,線性判別分析

非線性演算法:

  • KNN,k近鄰
  • CART,分類與迴歸樹
  • NB,貝葉斯分類器
  • SVM,支援向量機
models = {}
models['LR'] = LogisticRegression()
models['LDA'] = LinearDiscriminantAnalysis()
models['KNN'] = KNeighborsClassifier()
models['CART'] = DecisionTreeClassifier()
models['NB'] = GaussianNB()
models['SVM'] = SVC()
# 演算法評估
results = []
for key in models:
    kfold = KFold(n_splits=10, random_state=seed)
    cv_results = cross_val_score(models[key], X_train, Y_train, cv=kfold, scoring='accuracy')
    results.append(cv_results)
    print('%s: %f (%f)' % (key, cv_results.mean(), cv_results.std()))
LR: 0.966667 (0.040825)
LDA: 0.975000 (0.038188)
KNN: 0.983333 (0.033333)
CART: 0.975000 (0.038188)
NB: 0.975000 (0.053359)
SVM: 0.991667 (0.025000)
# 繪圖比較
fig = pyplot.figure()
fig.suptitle('Algorithm Comparison')
ax = fig.add_subplot(111)
pyplot.boxplot(results)
ax.set_xticklabels(models.keys())
pyplot.show()

在這裡插入圖片描述

# 使用評估資料集評估演算法
svm = SVC()
svm.fit(X=X_train, y=Y_train)
predictions = svm.predict(X_validation)
print(accuracy_score(Y_validation, predictions))
print(confusion_matrix(Y_validation, predictions))
print(classification_report(Y_validation, predictions))
0.9333333333333333
[[ 7  0  0]
 [ 0 10  2]
 [ 0  0 11]]
                 precision    recall  f1-score   support

    Iris-setosa       1.00      1.00      1.00         7
Iris-versicolor       1.00      0.83      0.91        12
 Iris-virginica       0.85      1.00      0.92        11

    avg / total       0.94      0.93      0.93        30

END.

參考:

《機器學習Python實踐》-- 魏貞原