14、线性插值--聚类初识

一、线性差值

image.png

image.png
import numpy as np

from scipy import interp
import matplotlib.pyplot as plt
# x 和 y之间存在规律,正弦波,每个点之间,间隔
x = np.linspace(0,2*np.pi,10)
y = np.sin(x)
plt.scatter(x,y)
<matplotlib.collections.PathCollection at 0x22e872f5608>
output_2_1.png
a = np.linspace(0,2*np.pi,30)
b = np.interp(a,x,y)#根据x和y之间的关系,对a进行目标值填充
plt.scatter(x,y,color = 'r')
plt.scatter(a,b,color = 'green')
<matplotlib.collections.PathCollection at 0x22e8762c988>
output_3_1.png
from sklearn.neighbors import KNeighborsRegressor
knn = KNeighborsRegressor(weights='distance',n_neighbors = 2)

knn.fit(x.reshape(-1,1),y)

b = knn.predict(a.reshape(-1,1))

plt.scatter(x,y,c = 'r')
plt.scatter(a,b,c = 'g')
<matplotlib.collections.PathCollection at 0x22e8c552e88>
output_5_1.png

三、ks-洛伦兹曲线

image.png
  • 洛伦兹曲线可以筛选最佳的阈值
    KS(Kolmogorov-Smirnov)值越大,表示模型能够将正、负客户区分开的程度越大。KS值的取值范围是[0,1]

通常来讲,KS>0.2即表示模型有较好的预测准确性。

ks需要TPR和FPR两个值:真正类率(true positive rate ,TPR), 计算公式为TPR=TP/ (TP+ FN),刻画的是分类器所识别出的 正实例占所有正实例的比例。另外一个是假正类率(false positive rate, FPR),计算公式为FPR= FP / (FP + TN),计算的是分类器错认为正类的负实例占所有负实例的比例。KS=max(TPR-FPR)。

import numpy as np

import matplotlib.pyplot as plt

from sklearn.metrics import roc_curve,confusion_matrix
y_true = np.array([1,1,1,1,1,1,0,0,0,1,1,0,0,1,1,0,0,1,1,0,0])
prob = np.array([0.42,0.73,0.55,0.37,0.57,0.70,0.25,0.23,0.46,0.62,0.76,0.46,0.55,0.56,0.56,0.38,0.37,0.73,0.77,0.21,0.39])
thresholds = np.linspace(0,1,50)
fpr = []
tpr = []
for t in thresholds:
    y_pred = (prob >= t).astype(np.int8)
    cm = confusion_matrix(y_true,y_pred)
    fpr.append(cm[1,0]/(cm[1,0] + cm[1,1]))
    tpr.append(cm[0,0]/(cm[0,0] + cm[0,1]))
plt.plot(fpr,tpr,label = 'ROC-Curve')
fpr = np.asarray(fpr)
tpr = np.asarray(tpr)
ks = tpr - fpr
index = ks.argmax()
plt.plot(fpr,ks,c = 'g')
plt.scatter(fpr[index],ks[index],c = 'r',s = 100)
plt.xlabel('FPR')# 阈值不同的
plt.ylabel('TPR')
print('当KS最大时,阈值是:%0.2f'%(thresholds[index]))
当KS最大时,阈值是:0.55
output_5_1.png

洛伦兹曲线作用:可以帮助我们筛选最合适的阈值

绘制双x轴

thresholds = np.linspace(0,1,50)
fpr = []
tpr = []
for t in thresholds:
    y_pred = (prob >= t).astype(np.int8)
    cm = confusion_matrix(y_true,y_pred)
    fpr.append(cm[1,0]/(cm[1,0] + cm[1,1]))
    tpr.append(cm[0,0]/(cm[0,0] + cm[0,1]))
ax = plt.subplot(111)
ax.plot(fpr,tpr,label = 'ROC-Curve')
ax.set_xlabel('FPR')# 阈值不同的
ax.set_ylabel('TPR')
fpr = np.asarray(fpr)
tpr = np.asarray(tpr)
ks = tpr - fpr
index = ks.argmax()
ax2 = ax.twiny()
ax2.plot(thresholds,ks,c = 'g')
ax2.scatter(thresholds[index],ks[index],c = 'r',s = 100)
ax2.set_xlabel('Threshold')
print('当KS最大时,阈值是:%0.2f'%(thresholds[index]))
当KS最大时,阈值是:0.55
output_8_1.png

四、聚类操作

(1初步使用)

  • 聚类---根据相似性分类
  • 特征量化--数字化
  • 量化之后,距离近相视,距离远,差异性大
  • 根据欧式距离来计算
  • 聚类是无监督学习,不需要目标值y
  • 自动的归类,手动各类定义。


    image.png

    image.png
  • 数据可以是多维的。
  • 初步使用代码:
import numpy as np
import matplotlib.pyplot as plt
# KNN k个邻居,此处的k,表示,将数据分成几类
from sklearn.cluster import KMeans
import pandas as pd
d:\python3.7.4\lib\importlib\_bootstrap.py:219: RuntimeWarning: numpy.ufunc size changed, may indicate binary incompatibility. Expected 192 from C header, got 216 from PyObject
  return f(*args, **kwds)
# 需要将亚洲国家对,分成三个类别
# 只有历年的统计数据,没有目标值(类别,等级)
data = pd.read_csv('./AsiaFootball.txt')
data
kmeans = KMeans(n_clusters=3)
# 无监督,只需要给数据X就可以
# 之前的降维算法,PCA也是无监督
kmeans.fit(data.iloc[:,1:])
y_ = kmeans.predict(data.iloc[:,1:])# 聚类算法预测、划分的类别
c = data['国家'].values
for i in range(3):
    cond = y_ == i#索引条件
    print('类别是%d的国家有:'%(i),c[cond])
类别是0的国家有: ['日本' '韩国']
类别是1的国家有: ['中国' '伊拉克' '卡塔尔' '阿联酋' '泰国' '越南' '阿曼' '印尼']
类别是2的国家有: ['伊朗' '沙特' '乌兹别克斯坦' '巴林' '朝鲜']
kmeans = KMeans(n_clusters=3)
# 无监督,只需要给数据X就可以
# 之前的降维算法,PCA也是无监督
kmeans.fit(data.iloc[:,1:])
y_ = kmeans.predict(data.iloc[:,1:])# 聚类算法预测、划分的类别
c = data['国家'].values
for i in range(3):
    cond = y_ == i#索引条件
    print('类别是%d的国家有:'%(i),c[cond])
类别是0的国家有: ['中国' '伊拉克' '卡塔尔' '阿联酋' '泰国' '越南' '阿曼' '印尼']
类别是1的国家有: ['日本' '韩国']
类别是2的国家有: ['伊朗' '沙特' '乌兹别克斯坦' '巴林' '朝鲜']
kmeans = KMeans(n_clusters=3)
# 无监督,只需要给数据X就可以
# 之前的降维算法,PCA也是无监督
kmeans.fit(data.iloc[:,1:])
y_ = kmeans.predict(data.iloc[:,1:])# 聚类算法预测、划分的类别
c = data['国家'].values
for i in range(3):
    cond = y_ == i#索引条件
    print('类别是%d的国家有:'%(i),c[cond])
类别是0的国家有: ['伊朗' '沙特' '乌兹别克斯坦' '巴林' '朝鲜']
类别是1的国家有: ['中国' '伊拉克' '卡塔尔' '阿联酋' '泰国' '越南' '阿曼' '印尼']
类别是2的国家有: ['日本' '韩国']

算法,进行了类别的划分,接下来,人介入,定义

# 类别2:日本、韩国 亚洲一流
# 类别0:伊朗、沙特、朝鲜……,亚洲二流
# 类别1:中国、伊拉克、泰国…… 亚洲三流
data['等级'] = y_
def convert(item):
    if item == 0:
        return '中等'
    elif item == 2:
        return '一流'
    else:
        return '末流'
data['等级'] = data['等级'].apply(convert)
data

(2、kmeans中选取k值)

  • 评价k选择的好坏---轮廓系数、兰德系数
    (1)轮廓系数
  • b 代表簇与簇之间的距离
  • a代表内之间的距离
  • 公式中 b 越大越好,a越小越好
  • 轮廓系数越大越好,簇内和簇间的计算

image.png

import warnings
warnings.filterwarnings('ignore')
import numpy as np

from sklearn import datasets

from sklearn.cluster import KMeans

import matplotlib.pyplot as plt
# 分类:准确率、召回率、精确率、F1值、ROC-AUC-KS
# 回归:R2_score、均方误差(MSE)、绝对值误差(MAE)……

# 聚类:轮廓系数,对聚类的评价指标,对应数学公式
from sklearn.metrics import silhouette_score
# 假数据,预先知道,数据X划分成3类
X,y = datasets.make_blobs(centers=3)
print(X.shape)
print(y)
plt.scatter(X[:,0],X[:,1],c = y)
(100, 2)
[2 2 2 1 2 2 0 1 0 1 0 2 1 2 0 1 0 2 0 0 1 2 0 1 1 1 0 1 1 0 1 1 0 0 2 2 1
 0 2 0 1 0 1 2 2 2 2 2 0 1 0 0 0 2 2 2 0 0 2 1 1 1 0 1 0 2 1 1 2 0 0 0 0 2
 2 0 2 1 0 1 1 1 0 1 2 1 2 1 0 0 1 1 2 2 2 2 0 2 0 1]





<matplotlib.collections.PathCollection at 0x25f49a41388>
output_1_2.png
plt.rcParams['font.sans-serif'] = 'KaiTi'
plt.rcParams['font.size'] = 18
plt.rcParams['axes.unicode_minus'] = False
# 可以画图,一目了然,数据简单,属性只有两个,所以可以画图
# 属性多,无法可视化,评价指标
# 轮廓系数
score = []
for i in range(2,7):
    kmeans = KMeans(n_clusters=i)
    kmeans.fit(X)
    y_ = kmeans.predict(X)# 预测类别 == 标签
#     plt.scatter(X[:,0],X[:,1],c = y_)
    score.append(silhouette_score(X,y_))
#     print('当聚类类别是6的时候,评价指标轮廓系数: ',silhouette_score(X,y_))
plt.plot(range(2,7),score)
plt.xlabel('K值')
plt.ylabel('轮廓系数',c = 'red')
# 结论:,当k值是3的时候,轮廓系数最大,这个时候,说明划分效果最好!
Text(0, 0.5, '轮廓系数')
output_3_1.png
y_
array([3, 0, 0, 1, 3, 3, 4, 1, 4, 1, 4, 3, 1, 0, 2, 1, 2, 3, 4, 2, 1, 3,
       2, 1, 1, 5, 2, 5, 1, 4, 5, 1, 2, 2, 0, 3, 5, 2, 0, 2, 5, 4, 5, 0,
       3, 0, 3, 0, 2, 5, 4, 2, 2, 0, 3, 0, 2, 4, 3, 1, 1, 5, 2, 5, 4, 0,
       1, 5, 3, 4, 2, 2, 4, 3, 0, 4, 3, 5, 2, 1, 5, 5, 2, 1, 3, 1, 3, 5,
       2, 2, 5, 5, 0, 3, 3, 3, 4, 0, 2, 1])
# 获取标签
kmeans.labels_
array([3, 0, 0, 1, 3, 3, 4, 1, 4, 1, 4, 3, 1, 0, 2, 1, 2, 3, 4, 2, 1, 3,
       2, 1, 1, 5, 2, 5, 1, 4, 5, 1, 2, 2, 0, 3, 5, 2, 0, 2, 5, 4, 5, 0,
       3, 0, 3, 0, 2, 5, 4, 2, 2, 0, 3, 0, 2, 4, 3, 1, 1, 5, 2, 5, 4, 0,
       1, 5, 3, 4, 2, 2, 4, 3, 0, 4, 3, 5, 2, 1, 5, 5, 2, 1, 3, 1, 3, 5,
       2, 2, 5, 5, 0, 3, 3, 3, 4, 0, 2, 1])

使用另一个评价指标

from sklearn.metrics import adjusted_rand_score# 调整兰德系数
score = []
for i in range(2,7):
    kmeans = KMeans(n_clusters=i)
    kmeans.fit(X)
    y_ = kmeans.predict(X)# 预测类别 == 标签
    score.append(adjusted_rand_score(y,y_))
plt.plot(range(2,7),score)
plt.xlabel('K值')
plt.ylabel('调整兰德系数',c = 'red')
# 结论:,当k值是3的时候,轮廓系数最大,这个时候,说明划分效果最好!
Text(0, 0.5, '调整兰德系数')
output_8_1.png

(2)兰德系数(Rand index)


image.png

image.png

image.png

DBSCAN--聚类

  • 基于密度的划分
    DBSCAN算法步骤大致描述如下:

  • 对于给定的邻域距离e和邻域最小样本个数MinPts:

  • 遍历所有样本,找出所有满足邻域距离e的核心对象的集合;

  • 任意选择一个核心对象,找出其所有密度可达的样本并生成聚类簇;

  • 从剩余的核心对象中移除2中找到的密度可达的样本;从更新后的核心对象集合重复执行2-3步直到核心对象都被遍历或移除。

import warnings
warnings.filterwarnings('ignore')
import numpy as np

from sklearn import datasets

from sklearn.cluster import KMeans,DBSCAN

import matplotlib.pyplot as plt

给一个密度的数据

# y中是两类:0,1
X,y = datasets.make_circles(n_samples=1000,noise=0.05,factor = 0.5)

# centers = [(1.5,1.5)] 元组,代表着,中心点的坐标值
# y1一类:0 + 2
X1,y1 = datasets.make_blobs(n_samples=500,n_features=2,centers=[(1.5,1.5)],cluster_std=0.2)

# 将circle和散点进行了数据合并
X = np.concatenate([X,X1])
y = np.concatenate([y,y1 + 2])

plt.scatter(X[:,0],X[:,1],c = y)
<matplotlib.collections.PathCollection at 0x1e09d3e7188>
output_2_1.png
# 根据距离,划分‘势力范围’
kmeans = KMeans(3)
kmeans.fit(X)
y_ = kmeans.labels_
plt.scatter(X[:,0],X[:,1],c = y_)
<matplotlib.collections.PathCollection at 0x1e09e8d3d08>
output_3_1.png
dbscan = DBSCAN(eps = 0.2,min_samples=5)
dbscan.fit(X)
y_ = dbscan.labels_
plt.scatter(X[:,0],X[:,1],c = y_)
<matplotlib.collections.PathCollection at 0x1e09ead7a48>
output_4_1.png

·

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容