当前位置:   article > 正文

聚类尝试_kprototypes

聚类尝试_kprototypes

在链家爬了一些二手房数据,尝试用聚类进行分析。

1. 一些简单的准备工作:导包、导数据、简单的数据提取

  1. # 导入常用的包
  2. import pandas as pd
  3. import matplotlib.pyplot as plt
  4. from sklearn import preprocessing
  5. import pickle
  6. import time
  7. import multiprocessing
  8. plt.rcParams['font.sans-serif']=['SimHei']
  9. plt.rcParams['axes.unicode_minus'] = False
  1. # 导入数据
  2. df_shanghai = pd.read_csv('sh_ershou_clean.csv', index_col = 0)
  3. df_hangzhou = pd.read_csv('hz_ershou_clean.csv', index_col = 0)
  4. print('df_shanghai.shape:{}'.format(df_shanghai.shape))
  5. print('df_hangzhou.shape:{}'.format(df_hangzhou.shape))
  1. # 提取建房时间
  2. df_shanghai['year'] = df_shanghai['info'].str.extract('([\d]+)年').astype('float')
  3. df_shanghai['age'] = 2022-df_shanghai.year

2. 数据预处理

2.1 数值型:标准化

  1. # 对数值型数据进行标准化
  2. t= preprocessing.StandardScaler().fit(df_shanghai[df_shanghai.describe().columns])
  3. df_shanghai_processed = pd.DataFrame(t.transform(df_shanghai[df_shanghai.describe().columns]))
  4. df_shanghai_processed.columns = df_shanghai.describe().columns

2.2 字符型:labelencoding

  1. # 类别型变量进行labelenconding
  2. df_shanghai_processed['location1'] = df_shanghai.location1
  3. le = preprocessing.LabelEncoder()
  4. df_shanghai_processed['location1'] = le.fit_transform(df_shanghai_processed['location1'])
  5. # 将label_encoding的映射关系记录下来
  6. def pkl_save(filename, file):
  7. #将file保存到filename中
  8. output = open(filename, 'wb')
  9. pickle.dump(file, output)
  10. output.close()
  11. pkl_save('shanghai_location1_labelencoding.pkl', le)

2.3 缺失值填充

  1. # 缺失值填充
  2. df_shanghai_processed.year.fillna(df_shanghai_processed.year.mean(), inplace = True)
  3. df_shanghai_processed.age.fillna(df_shanghai_processed.age.mean(), inplace = True)

3. 调用kmodes包进行聚类

3.1 模型训练

  1. from kmodes.kprototypes import KPrototypes
  2. cate_index = [5] # 为类别型变量在columns中的索引
  3. def TrainCluster(df, model_name=None, start_k=2, end_k=10):
  4. print('training cluster')
  5. K = []
  6. SSE = []
  7. silhouette_all=[]
  8. models = [] #保存每次的模型
  9. for i in range(start_k, end_k):
  10. start = time.perf_counter ()
  11. kproto_model = KPrototypes(n_clusters=i, n_jobs=multiprocessing.cpu_count())
  12. kproto_model.fit(df_shanghai_processed,categorical=cate_index)
  13. SSE.append(kproto_model.cost_) # 保存每一个k值的SSE值
  14. K.append(i)
  15. print('{}-prototypes SSE loss = {}'.format(i, kproto_model.cost_))
  16. models.append(kproto_model) #保存每个k值对应的模型
  17. end = time.perf_counter ()
  18. print('Running time: %s Seconds'%(end-start))
  19. return(K,SSE,models)
  20. K, SSE, models = TrainCluster(df = df_shanghai_processed)

3.2 类别数量选择

  1. # 决定选择5
  2. plt.plot(K, SSE)
  3. plt.xlabel('聚类类别数k')
  4. plt.ylabel('SSE')
  5. plt.xticks(K)
  6. plt.title('用肘部法则来确定最佳的k值')
  7. plt.show()

结果如下图:

 3.3 确定类别数量k后,进行可视化等后续的分析处理

  1. #确定了最佳的k值后:5
  2. best_model = models[K.index(5)]
  3. # 对样本类别进行标记
  4. df_shanghai['labels_'] = best_model.labels_
  5. # 提取每一簇的中心
  6. center = pd.DataFrame(best_model.cluster_centroids_ )
  7. center.columns = df_shanghai_processed.columns
  8. # 还原每一簇中心,得到标准化之前对应的原始值
  9. for col in center.columns[:-1]:
  10. col_new = col+'_raw'
  11. mean = df_shanghai[col].mean()
  12. std = df_shanghai[col].std()
  13. center[col_new] = center[col]*std+mean
  14. print(col_new)
  15. # 绘制散点图
  16. colors1 = '#00CED1' #点的颜色
  17. colors2 = '#DC143C'
  18. col1 = 'total_price'
  19. col2 = 'area'
  20. for label in df_shanghai.labels_.unique():
  21. if label != 3:
  22. x = df_shanghai.loc[df_shanghai.labels_ == label, col1]
  23. y = df_shanghai.loc[df_shanghai.labels_ == label, col2]
  24. plt.scatter(x, y, label = str(label), alpha = 0.2)
  25. plt.legend()

簇中心各分量如下:

散点图如下:

remark:

只能说跑通了调用kprototypes进行聚类的流程,后续考虑调用高德或者百度地图的接口,添加房子到人民广场的距离这一变量,去掉location这个类别型变量直接利用kmeans进行聚类。

添加距离变量可参考:

Python:爬了下链家的小区数据,为数据分析弄素材~_Cyber的博客-CSDN博客_小区数据前言:最近在学数据分析,包括主成分分析、因子分析、聚类。。。等等,没有数据可不行啊,所以就把链家的小区数据给爬了一下,为后续的分析实战弄素材~一、数据爬取准备链家的网站还是很好爬的,地址很有标准,可以看到下图中有5391个小区,但是很多都是无效小区,而且单页只有30个小区且最多30页,所以我们需要从源码上了解具体结构。从第二页起,链接就变成pg2之类的,依次类推,就可以爬取30页以后的数...https://blog.csdn.net/weixin_42029733/article/details/93064205?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-1.queryctr&spm=1001.2101.3001.4242.2&utm_relevant_index=4根据经纬度计算两地距离_weixin_34218890的博客-CSDN博客最近工作需要,网上搜索了下根据经纬度计算两地距离的方法,发现要么是几何法,画图、作一堆辅助线,然后证明推理,要么二话不说直接套公式。这篇文章介绍一种容易理解的方式来求这个距离。0b00 思路地球是个不规则的椭球体、为了简便我们当作球体来计算。 球体上两地的最短距离就是经过两点的大圆的劣弧长度。思路如下:弧长 ← 弦长(两点距离)...https://blog.csdn.net/weixin_34218890/article/details/88740639

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/803121
推荐阅读
相关标签
  

闽ICP备14008679号