機器學習之K-Means算法

K-Means算法對航空公司客戶進行分類

1.數據預處理:

import numpy as np
import pandas as pd

data = pd.read_csv("./air_data.csv", encoding='gb18030', engine='python')
print(data.columns)
print(data.shape)
# 保留票價不爲空的值
mask1 = data["SUM_YR_1"].notnull() & data["SUM_YR_2"].notnull()
data1 = data.loc[mask1, :]
print(data1.shape)
# 保留票價不爲0,平均折扣率不爲0,總飛行公里數大於0的記錄
mask2 = data["SUM_YR_1"] != 0
mask3 = data["SUM_YR_2"] != 0
mask4 = data["avg_discount"] != 0
mask5 = data["SEG_KM_SUM"] > 0
mask = mask4 & mask5 & (mask2 | mask3)
airline = data1.loc[mask, :]
print(airline.shape)

# 選取需求特徵
airline_selection = airline[["FFP_DATE", "LOAD_TIME", "FLIGHT_COUNT", "LAST_TO_END", "avg_discount", "SEG_KM_SUM"]]

# 構建L特徵
L = pd.to_datetime(airline_selection["LOAD_TIME"]) - pd.to_datetime(airline_selection["FFP_DATE"])

# 提取數字,由於模型中L單位爲:月,所以需要除以30
# apply 對整列數據進行操作
L = L.apply(lambda x: round(int(str(x).split(' ')[0]) / 30, 1))

# 合併特徵
airline_features = pd.concat([L, airline_selection.iloc[:, 2:]], axis=1)
print('構建的LRFMC特徵前5行爲:\n', airline_features.head())

# 標準差標準化: 使用sklearn 中preprocessing 模塊的StandardScaler 函數; 也可以使用自定義的方法(數據分析中標準化方法,因爲此處不需要對訓練集與測試集用同一套規則)
from sklearn.preprocessing import StandardScaler  # 標準差標準化

data = StandardScaler().fit_transform(airline_features)
np.savez('airline_scale.npz', data)
print('標準化後LRFMC五個特徵爲:\n', data[:5, :])

2.K-Means算法進行分類:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans  # 導入kmeans算法

airline_scale = np.load('airline_scale.npz')['arr_0']
k = 5  # 確定聚類中心數
# 構建模型
kmeans_model = KMeans(n_clusters=k)
fit_kmeans = kmeans_model.fit(airline_scale)  # 模型訓練

# kmeans_model.cluster_centers_  # 查看聚類中心
# kmeans_model.labels_  # 查看樣本的類別標籤
print(type(kmeans_model.labels_))
# 統計不同類別樣本的數目

# 易錯:只有pandas中Series類型纔有value_counts()屬性
r1 = pd.Series(kmeans_model.labels_).value_counts()
print('最終每個類別的數目爲:\n', r1)

# 任務3 航空分析結果可視化
# 做可視化:
plt.figure(figsize=(6, 6))
L = 5
angles = np.linspace(0, 2 * np.pi, L, endpoint=False)
labels = ['L', 'R', 'F', 'C', 'M']
data = kmeans_model.cluster_centers_
# 閉合曲線:
angles = np.concatenate((angles, [angles[0]]))
data = np.concatenate((data, data[:, 0].reshape(5, 1)), axis=1).T

# 繪圖:
plt.polar(angles, data)
plt.xticks(angles, labels)
plt.show()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章