文本特征提取
字典提取
sklearn 归一化:sklearn.preprocessing.MinMaxScaler
-》语法:MinMaxScaler(feature_range(0,1)…)
- X:numpy array格式的数据[n_samples,n_features]
- 返回值:转换后的形状相同的array
-》步骤:
1.实例化MinMaxScaler
2.通过fit_transform转换
from sklearn.preprocessing import MinMaxScaler
def mm():
"""归一化"""
mm = MinMaxScaler(feature_range=(2,3))
data = mm.fit_transform([[90,2,10,40],
[60,4,15,45],
[32,44,54,22]])
print(data)
return None
if __name__ =="__main__":
mm()
->归一化应用
当几个特征同等重要的时候,进行归一化.(把所有的数据都转化到统一标准下)
目的:使一个特征对最终结果不会造成更大的影响(有时候一个数的数值很大,会影响到其他的影响因素,使其他影响因素的影响小得忽略不计,因此要进行归一化)
->问题:如果数据中异常点较多,会有什么影响?
公式:
异常值对最大值和最小值的影响很大,会对结果造成偏差.
所以归一化的缺点就使非常容易受异常点的影响,所以这种方法受鲁棒性交叉,只适合传统精确小数据场景.
#鲁棒性:反应产品的稳定性
目的和归一化一样,使得一个特征对最终结果不会造成最大的影响.
->特点:通过对原始数据进行变换把数据平均值变换到0,标准差为1的范围内
->公式:
方差为0 的情况:所有这个特征所有值都一样,数据越集中,方差越小;数据越离散,方差越大.
-> sklearn特征化API:scikit-learn.processing.StandardScaler
->语法:
- 处理之后每列所有数据都聚集在均值为0附近标准差为1
- StandardScaler.fit_transform(X)
- X:numpy.array格式的数据[n_samples,n_features]
- 返回值:转换后的形状相同的array
StandardScaler.mean_- 原始数据中每列特征的平均值
StandardScaler.std_- 原始数据每列特征的方差
from sklearn.preprocessing import StandardScaler
def zz():
"""
标准化
:return:
"""
# 实例化对象
bz = StandardScaler()
# 调用方法
data = bz.fit_transform([
[-1,-1,3],
[2,4,2],
[4,6,-1]
])
print(data)
return None
if __name__ =="__main__":
zz()
->标准化总结:在以有的样本足够多的情况下比较稳定,适合现代嘈杂大数据场景.
数值型的数据:标准缩放:1.归一化;2.标准化;3.缺失值(主要用pandas处理)
类别型数据:one-hot编码, 在该列中,是就用1 表示,不是就用0表示
时间类型:时间的切分
如果每行或每列的数据确实达到一定的比例,建议放弃正航或者整列
可以通过缺失值每行或者每列的平均值\中位数来填充(建议按列)
-> sklearn缺失值API:sklearn.processing.imputer
->语法:
- 0 是按列;1是按行
- 完成缺失值插补
imputer.fit_transform(X)
- X:numpu.array 格式的数据[n_samples,n_features]
- 返回值:转换后的形状相同的array
->关于np.nan(np.NaN)
1.numpy的数组中可以使用np.nan/np.NaN 来代替缺失值,属于float类型
2.如果是文件中的一些缺失值,可以替换成nan,通过np.array转化为float型的数组即可
对数据进行处理
->特征预处理是什么?
通过特定的统计方法(数学方法)将数据转换为算法要求的数据
->特征处理API,所有预处理的方法都在这个模块中
sklearn.processing
维度:特征的数量
-》特征选择是什么
特征选择就是单纯的从提取到的所有特征中选择部分特征作为训练集特征,特征在选择前和选择后可以改变值,也不改变值,但是选择后的特征位数肯定比选择前小,毕竟我们只选择了其中的一部分特征。
-》特征选择的主要方法(三大武器)
- 删除所有低方差特征
- Variance.fit_transform(X)
- X:numpy array格式的数据[n_samples,n_features]
- 返回值:训练集差异低于threshold的特征将被删除
- 默认值是所有非零方差特征,即删除所有样本中具有相同值的特征
-》流程
1.初始化VarianceThreshold,指定阈值方差
2.调用fit_transform方法
from sklearn.feature_selection import VarianceThreshold
def var():
"""
删除低方差的特征
:return: None
"""
var = VarianceThreshold(threshold=0.0)
data = var.fit_transform([
[0,2,0,3],
[0,1,4,3],
[0,1,1,3]
])
print(data)
return None
if __name__ =="__main__":
var()
根据实际情况调参
-》特征选择原因
-》其他特征选择方法
神经网络(重点,后期写)
-》API
sklearn.decomposition
-》PCA是什么(应用场景不是特别多)
-》应用场景
特征数量达到上百的时候,首先考虑要不要用PCA来简化数据特征
特征会减少,同时数据也会改变
-》降维就好比用照相机去拍三维世界,拍出来的照片能让人一眼就看出来是个什么东西,将维数降低,但是里面所有数据的数据信息不能损耗很多
-》高纬度数据容易出现的问题
训练集 | 测试集 |
---|---|
70% | 30% |
80% | 20% |
75% | 25%(用得最多) |
建立模型 | 评估模型 |
不同的算法评估标准是不一样的
-》sklearn数据集划分API
sklearn.model_selection.train_test_split
-》scikit-learn数据集API介绍
- 加载获取流行数据集
- dataset.load_*()
- 获取小规模数据集,数据包含在datasets里
- 获取大规模数据集,需要从网络上下载,函数的第一个参数是data_home,表示数据集下载的目录,默认是~/scikit_learn_data/
主要区别是在于数据的规模大小
-》scikit-learn获取数据集返回的类型
- data : 特征数据数组,是[n_samples*n_features]的二维numpy ndarray数组
- target:标签数组 ,是n_samples的一维numpyndarray数组
- DESCR:数据描述
- feature_names:特征名,新闻数据,手写数字、回归数据集没有
- target_names:标签名
-》sklearn分类数据集
sklearn.datasets.load_iris():加载并返回鸢尾花的数据集
sklearn.datasets.load_digits():加载并返回数字数据集
-》数据集进行分割
sklearn.model_selection.train_test_split(*arrays,**options)
-》用于分类的大数据集
sklearn.datasets.fetch_20newsgroup(data_home=None,subset=‘train’)
- 清除目录下的数据
-》selearn 回归数据集
sklearn.databases.load_boston():加载并返回波士顿房价数据集
sklearn.datasets.load_diabetes():加载和返回糖尿并数据集
fit_transform():输入数据直接转换
fit():输入数据
transform():转换数据,如果后面还有数据要传入,就可以直接使用这个,否则标准会被修改
sklearn中,估计器(estimator)是一个重要的角色,是一类实现了算法的API
1.用于分类的估计器
明确几点问题:
(1)算法是核心,数据和计算是基础
(2)找准定位
大部分复杂模型的算法设计都是算法工程师在做,而我们
我们应该怎么做?
-》机器学算法判别依据
看数据类型
-》数据类型
-》数据类型的不同应用
数据的类型将是机器学习不同问题不同处理的依据
-》机器学习算法分类
- 分类 :K-近邻算法、贝叶斯分类、决策树与随机森林、逻辑回归、神经网络
- 回归 :线性回归、岭回归
- 标注:隐马尔可夫模型(不做要求)
- 聚类(K-means)
分类:目标值是离散型数据类型
回归:目标值是连续性数据类型
分类是监督学习的一个核心问题,在监督学习中,当输出变量取有限个离散值时,预测问题变为分类问题,最基础的便是二分类问题,即判断是非,从两个类别中选择一个作为预测结果。
分类的应用:分类在于根据其特性将数据“分门别类”,在银行业务中,构建一个客户分类模型,按客户按照贷款风险大小进行分类;在图像处理中,分类可以用来检测图像中是否又人脸出现,动物类别等;手写识别中:分类可以用于识别手写的数字;文本分类,这里的文本可以时新闻报道,网页,电子邮件,学术论文;…
回归问题的应用:房价预测,根据某地历史房价数据,进行一个预测;金融信息:每日股票值;…
明确当前公司要做什么事情。
根据你的邻居来判断你的类型
-》定义:如果一个样本特征空间中的K个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别
-》来源:KNN算法最早是由Cover和Hart 提出的一种分类算法
-》sklearn K-近邻算法API
- n_neighbors:int 可选(默认为5),k_neighbors查询默认使用的邻居数
- algorithm:(’auto’,‘ball_tree’,‘kd_tree’,‘brute’),可选用与计算最近邻居的算法,‘ball_tree’将会使用BallTree,'kd_tree’将使用KDTree,'auto’将尝试根据传递给fit方法的值来决定最合适的算法(不同实现方式影响效率)
【案例】预测入住位置
-》目标:预测一个人登记的地方
-》字段:row_id:等级事件的ID
xy:坐标
准确性:定位准确性
时间:时间戳
place_id:业务的ID,这是预测的目标
-》分析:
特征值:坐标、准确性、时间
目标值:place_id
(通过目标值看出来是一个分类问题)
处理:
【特征工程做或不做可以对比一下】
目标值不用做标准化,对测试集和训练集的特征值进行标准化(标准化对准确率的影响非常大)
-》1.概率基础
-》算法
朴素贝叶斯的前提是特征独立
朴素的意思就是条件独立的意思
比如: 给你一个文档,看是科技或者娱乐的概率,谁的概率大, 就将之归为哪个类别
-》公式
例子:
思考:属于某个类别为0,不合适,要解决这个问题。有一个系数
-》sklearn 朴素贝叶斯实现API
这个算法没有参数可以调, 参数的大小没有影响
案例:利用朴素贝叶斯对20个新闻分类
https://blog.csdn.net/qq_40883132/article/details/83119735
-》朴素贝叶斯主要用于文本分类,现在神经网络效果比朴素贝叶斯好
eatimator_score() :一般常见使用的是准确率,即预测结果正确的百分比 混淆矩阵中的:TP+TN/所有结果
-》精确率(一般没有场景考虑)
预测结果为正例样本中真实为正例的比例(查得准)
混淆矩阵中的:tp/tp+fp
-》召回率(在医院查癌症的要越高越好)
真实为正例的样本中预测结果为正例的比例(查得全,对正样本得区分能力)
混淆矩阵中的:tp/tp+FN
-》决策树
决策数的思想来源非常朴素,程序设计中的条件分支结构就是if-then结构,最早的决策树就是利用这类结构分割数据的一种分类学习方法
-》信息熵
信息熵的概念来描述信源的不确定度。
-》决策树的划分依据–信息增益(把信息增益大的放树的前面)
得知一个特征条件之后,减少的信息熵的大小
-》常见的决策数使用的算法
-》sklearn 决策树API
class sklearn.tree.DecisionTreeClassifier(criterion=‘gini’,max_depth=None,random_state=None)
-》决策树的结构、本地保存
1.sklearn.tree.export_graphviz() 该函数能够导出DOT格式
tree.export_graphviz(eatimator,out_file=‘tree.dot’,feature_names=[","])
2.工具:(能够将dot文件转换为pdf、png)
安装:graphviz
ubantu:sudo
windows安装参考http://www.cnblogs.com/shuodehaoa/p/8667045.html
在含有文件路径的目录下WINDOWS cmd 种使用:dot -Tpdf tree.dot -o output.pdf 这个命令,就可以生成决策树了
-》决策树的优缺点以及改进
- 简单的理解和解释,树木可视化
- 需要很少的数据准备,其他技术通常需要数据归一化
- 决策树学习者可以创建不能很好地推广数据过于复杂地树,这被称为过拟合
- 剪枝cart算法(决策树API当中已经实现,随机森林参数调优有相关介绍)
- 随机森林
注:企业重要决策,由于决策树很好的分析能力,在决策过程中应用较多
from sklearn.feature_extraction import DictVectorizer
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier,export_graphviz
def decision():
"""
决策树对泰坦尼克号进行预测生死
:return: None
"""
# 获取数据
taitan = pd.read_excel("./tiantic1.xlsx")
# print(taitan)
# 处理数据,找出特征值和目标值
x = taitan[['Pclass','Age','Sex']]
y = taitan['Survived']
# 处理缺失值
x['Age'].fillna(x['Age'].mean(),inplace=True)
# 分割数据集的训练集和测试集
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.25)
# 进行处理(特征工程)特征-》类别-》one-hot编码
# 1.字典特征抽取(转化为字典进行处理)
#实例化
dict = DictVectorizer(sparse=False)
# 调用方法,对数据进行转换,可以先分割数据,再进行转换; 也可以先转换再分割数据
x_train= dict.fit_transform(x_train.to_dict(orient='records')) # 转换为字典的方法,默认是一行一行的转换的
print(dict.get_feature_names())
x_test = dict.transform(x_test.to_dict(orient='records'))
print(x_train)
# 用决策树进行预测
dec = DecisionTreeClassifier(max_depth=2)
dec.fit(x_train,y_train)
# 预测准确率
print("预测的准确率为:",dec.score(x_test,y_test))
# 导出决策树的结构
export_graphviz(dec,out_file="./tree.dot",feature_names=['年龄', 'Pclass', '女性', '男性'])
return None
if __name__ =="__main__":
decision()
-》集成学习方法
集成学习方法通过建立几个模型组合来解决单一预测问题,它地工作原理是生成多个分类器/模型,各自独立地学习和作出预测,这些预测最后结合成单预测,因此优于任何一个但分类的做出预测。
-》随机森林是什么
包含多个决策树的分类器,并且其输出的类别是由个别输出的类别的众数而定(多颗决策树投票决定)
-》随机森林地过程、优势
单个树的建立过程: 现在有N个样本,M个特征
1.随机在N个样本众选择一个样本,重复N次,有可能重复
2.随机在M个特征众选出m个特征
建立10颗决策树,样本、特征、大多不一样,随机有返回的抽样(bootstrap抽样)
为什么要随机抽样训练集?
如果不进行随机抽样,每棵树的训练集都一样,那么最终训练出的树分类结果也是完全一样的
为什么要有放回的抽样?
如果不是有放回抽样,那么每棵树的训练样本都是不同的,都是没有交集的,这样每棵树都是”有偏的“,都是绝对”片面的“,也就是说每棵树训练出来都是有很大差异的,而随机森林最后分类取决于多颗树(到分类器)的投票表决。
-》随机森林API
class sklearn.ensemble.RandomForestClassifier(n_estimators=10,criterion=“gini”,max_depth=None,bootstrap=True,random_state=None)
-》超参数
n_estimator 决策树的数量
max_depth 每颗树的深度限制
-》随机森林的优点(没有缺点)
from sklearn.feature_extraction import DictVectorizer
import pandas as pd
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.ensemble import RandomForestClassifier
def decision():
"""
随机森林对泰坦尼克号进行预测生死
:return: None
"""
# 获取数据
taitan = pd.read_excel("./tiantic1.xlsx")
# print(taitan)
# 处理数据,找出特征值和目标值
x = taitan[['Pclass','Age','Sex']]
y = taitan['Survived']
# 处理缺失值
x['Age'].fillna(x['Age'].mean(),inplace=True)
# 分割数据集的训练集和测试集
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.25)
# 进行处理(特征工程)特征-》类别-》one-hot编码
# 1.字典特征抽取(转化为字典进行处理)
#实例化
dict = DictVectorizer(sparse=False)
# 调用方法,对数据进行转换,可以先分割数据,再进行转换; 也可以先转换再分割数据
x_train= dict.fit_transform(x_train.to_dict(orient='records')) # 转换为字典的方法,默认是一行一行的转换的
print(dict.get_feature_names())
x_test = dict.transform(x_test.to_dict(orient='records'))
print(x_train)
# 用随机森林进行预测(超参数调优)
rf = RandomForestClassifier()
param ={"n_estimators":[120,200,300,500,800,1200],"max_depth":[5,8,15,25,30]}
# 网格搜索和交叉验证
gc = GridSearchCV(rf,param_grid=param,cv=2)
gc.fit(x_train,y_train)
print("准确率:",gc.score(x_test,y_test))
print("查看选择的参数模型:",gc.best_params_)
return None
if __name__ =="__main__":
decision()
目标值是一个连续型的值判定为回归问题
应用:房价预测、销售额预测、贷款额度的预测(和是否得到贷款是两个问题)
-》回归问题转换为分类问题
1.期末成绩的好坏
0.7x考试成绩+ 0.3x平时成绩
2.西瓜好坏
0.2x色泽+ 0.5x根蒂+ 0.3x敲声
-》API(线性回归和梯度下降)
from sklearn.linear_model import LinearRegression,SGDClassifier
矩阵:大多数算法的计算基础
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression,SGDClassifier
from sklearn.metrics import mean_squared_error # 均方误差
def myliner():
"""
线性回归预测房子价格(波士顿房价)
:return:None
"""
# 获取数据
lb = load_boston()
# print(lb)
# 分割数据集和训练集
x_train,x_test,y_train,y_test=train_test_split(lb.data,lb.target,test_size=0.25)
# print(y_train,y_test)
# 进行标准化处理?目标值处理?
std_x = StandardScaler()
x_train = std_x.fit_transform(x_train)
x_test = std_x.transform(x_test)
# 目标值
std_y = StandardScaler()
y_train = std_y.fit_transform(y_train)
y_test = std_y.transform(y_test)
# 正规回归方程求解方式预测结果
lr = LinearRegression()
lr.fit(x_train,y_train)
print(lr.coef_) # 相关系数
# 预测测试集的房子价格
y_lr_predict = std_y.inverse_transform(lr.predict(x_test))
print("正规方程测试集里面每个房子的预测价格:",y_lr_predict)
print("正规方程的均方误差:",mean_squared_error(std_y.inverse_transform(y_test),y_lr_predict))
# # 梯度下降法进行房价预测
# sgd =SGDClassifier()
#
# sgd.fit(x_train,y_train)
# print(sgd.coef_)
# # 预测测试集的房子价格
# y_sgd_predict = std_y.inverse_transform(lr.predict(x_test))
#
# print("梯度下降法测试集里面每个房子的预测价格:", y_sgd_predict)
# print("梯度下降法的均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_sgd_predict))
if __name__ =="__main__":
myliner()
from sklearn.metrics import mean_squared_error
-》梯度下降和正规方程的区别
梯度下降 | 正规方程 |
---|---|
需要选择学习率α | 不需要 |
需要多次迭代 | 一次运算得出 |
当特征数量n大时也能较好的适用 | 需要计算(XTX)^(-1) |
适用于各种模型 | 只适用于线性模型,不适合逻辑回归模型等其他模型 |
如果特征数量n较大则运算代价大,因为矩阵逆的计算时回复杂度为O[n^2],通常来说当n小于10000时还是可以接受的
梯度下降是一个通用的算法,都可以用
-》线性回归于梯度下降评估
特点:线性回归时最简单、易用的回归模型,从某种程度上限制了使用,尽管如此,在不知道特征之间关系的前提下,我们仍然使用线性回归器作为大多数系统的首要选择
-》过拟合和欠拟合
线性回归不能解决过拟合问题,对线性模型进行训练学习会变成复杂模型
-》注意
对线性模型进行训练学习会变成复杂模型。
问题:线性回归拟合的数据一定是线性的吗? 不一定,现实中的数据并不可能是一条直线, 可能是平方、立方等关系。复杂模型就是X不只是一次方,还可能是多次方,我们不能够将X值去掉,但是我们可以将高次方的特征前的系数变为0(岭回归)
-》欠拟合的原因以及解决方法
原因:学习到数据的特征过少
解决办法:增加数据的特征数量
-》过拟合原因以及解决方法
原因:原始特征国哆,存在一些嘈杂特征
(模型过于复杂是因为模型尝试去兼顾各个测试数据点)
解决办法:
1.进行特征选择,消除关联性大的特征(看不出来几次方的关系,很难做)
2.交叉验证(让所有数据都有过训练)
3.正则化
-》判断欠拟合和过拟合的办法
根据结果现象判断,交叉验证:训练集结果和测试集来作对比
-》回归是用岭回归解决过拟合,分类是用随机森林解决过拟合
-》特征选择
过滤式:低方差特征
嵌入式:正则化、决策树、神经网络
-》L2正则化:减少高次项特征值的权重使之趋近为0,不断地去尝试,调整,最后看哪个效果好。
优点:越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象。
线性回归LinearRegression 容易出现过拟合,为了把训练集数据表现更好,就要对之L2正则化,Ridge 岭回归,是带有正则化的线性回归,解决过拟合
-》API
sklearn.linear_model.Ridge
-》使用
sklearn.linear_model.Ridge(alpha=1.0)
面试:回归算法中怎么去调优的?怎么解决过拟合欠拟合现象? 一定答出正则化,正则化系数的大小对权重的影响,正则化力度越来越大的时候,模型就会越来越简单(调参),通过正则化选出一些特征值,来调优。
代码略。
真正想要预测东西的时候, 要将训练集固定,否则会每次结果不一样。
-》岭回归和线性回归的比较
岭回归得到的回归系数更符合实际,更可靠,另外,能让 估计参数的波动范围变小,变得更稳定,再存在病态数据(异常数据)偏多的研究中有较大的实用价值。
from sklearn.externals import joblib
模型训练好后,将模型保存下来,下次使用的话直接加载,相当于固定模型的作用
-》保存
joblib.dump(rf,‘test.pkl’) (训练好后写)
-》加载
estimator = joblib.load(‘test.pkl’) 先导出模型再进行预测
注意:文件格式是pkl
会产生一个文件,要使用这个文件的时候直接joblib.load就行啦
线性回归的式子作为逻辑回归的输入
-》应用场景
广告点击率 (点击、没点击)
是否为垃圾邮件
是否患病
金融诈骗
虚假账号
总结: 解决2分类问题,逻辑回归能得出概率值
-》逻辑回归的输入
线性回归一模一样,得出一个值,也会存在过拟合欠拟合
-》sigmoid函数
值在【0,1】
将输入转化为0,1 之间的值,中间值是0.5,将输入转为一个具体的概率值
-》损失函数、优化
与线性回归原理相同,但由于是分类问题,损失函数不一样,只能通过梯度下降求解
对数似然损失函数
只判断属于一个类别的概率
-》损失函数均方误差和对数似然损失的对比
均方 误差不存在多个局部最低点,只有一个最小值
对数的似然损失由多个局部最小值,想要找到真正的最小值,目前还解决不了,但有两种改善方法:1.多次随机初始化, 让他们分别去找最小值然后再做比较,这样也不一定能找到最小值;2.再求解过程中调整学习率; 尽管没有全局最低点,但不影响优化效果。
-》API
sklearn.linear_moder.LogisticRegression(penalty=‘l2’,C=1.0) # 自带正则化, C 是正则化力度,所以它能解决过拟合问题
-》【案例】良/恶性乳腺肿瘤数据(线性分类)
https://www.cnblogs.com/chenice/p/7202045.html
softmax :逻辑回归再多酚类问题上的推广(神经网络上:图像识别)
-》逻辑回归和朴素贝叶斯的区别
经常被问到的一点:
一个是生成模型,一个是判别模型
. | 逻辑回归 | 朴素贝叶斯 |
---|---|---|
解决问题 | 二分类 | 多分类问题 |
应用场景 | 癌症、二分类需要概率 | 文本分类 |
参数 | 正则化力度 | 没有 |
相同点:得出的结果都有概率解释
朴素贝叶斯要有先验概率, 提前再数据中获取的概率(每个类别在历史数据上的该利率情况),是属于生成模型
而逻辑回归没有先验概率,是属于判别模型
判别模型和生成模型的判断依据是是否有先验概率。
判别模型:K近邻、随机森林、决策树、神经网络
生成模型:朴素贝叶斯、隐马尔可夫模型
-》特点
没有目标值
K :把数据划分为多少个类别(一般在公司里是知道类别的个数的,如果不知道类别的个数,就是一个超参数了)
例: 要将一群数据分为3个类别
1.随机在数据中抽取3个样本,当作3了类别的中心点(k1,k2,k3)
2.计算其余的点分别到这3个中心点的距离,每一个样本有3个距离,从中选出距离最近的一个点,作为自己的标记,最后形成了3个族群
3.分别计算这3个族群的平均值,将这个平均值与最开始抽取的3个点来作比较,如果差距大,则将平均值作为新的3个中心点,重复第二步,一直到平均值与中心点大致相同为止。
-》API
sklearn.cluster.KMeans(n_cluster=8,init=‘k-means++’)
聚类一般都做在分类之前,预测客户类别
# 建立颜色的列表
colored = ['r', 'g', 'p', 'b']
# 将4种类别以不同颜色显示出来
corl = [colored[i] for i in predict] # predict 就是最后分类出的列表
注:对于每个点i 为已聚类数据中的样本,bi 为i到其他族群的所有样本的距离的最小值,ai 为i到本身簇的距离平均值
最终计算出所有的样本点的轮廓系数平均值,每个样本都有一个轮廓系数
聚类原则:外部 距离最大化,内部距离最小化
极端的情况下 :bi>>ai:1 完美
ai>>bi:-1 最差的情况
所以每一个样本的轮廓系数是[-1,1],轮廓系数越靠近1越好,超过0.1 的情况就是聚类效果好的。
-》评估API
sklearn.metrics.sihouette_score(X,labels)
-》总结kmeans
特点:采用迭代式算法,直观易懂并且使用
缺点:容易收敛到局部最优解(算法中多次聚类来解决这个问题)
注意:聚类一般在分类之前使用