机器学习强化(数据清洗、实战理解)

一、计算赔率(素数、合数赌博)

import operator
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
from time import time
import math
from collections import Counter

def is_prime(x):
    return 0 not in [x % i for i in range(2, int(math.sqrt(x)) + 1)]

def is_prime3(x):
    flag = True
    for p in p_list2:
        if p > math.sqrt(x):
            break
        if x % p == 0:
            flag = False
            break
    if flag:
        p_list2.append(x)
    return flag

if __name__ == "__main__":
    a = 2
    b = 100000

    # 方法1:直接计算
    t = time()
    p = [p for p in range(a, b) if 0 not in [p % d for d in range(2, int(math.sqrt(p)) + 1)]]
    print(time() - t)
    print(p)

    # 方法2:利用filter,可以节省一定时间
    t = time()
    p = filter(is_prime, range(a, b))
    print(time() - t)
    print(p)

    # 方法3:利用filter和lambda,利用filter后,方法写在外面与里面运行时间差别不大
    t = time()
    is_prime2 = (lambda x: 0 not in [x % i for i in range(2, int(math.sqrt(x)) + 1)])
    p = filter(is_prime2, range(a, b))
    print(time() - t)
    print(p)

    # 方法4:定义
    #创建一个空列表后
    t = time()
    #创建一个空列表后
    p_list = []
    #进入循环,将每一个素数存入列表,由于合数一定可以被某一个素数整除,所以只需要判断列表中的素数即可
    for i in range(2, b):
        flag = True
        for p in p_list:
            if p > math.sqrt(i):
                break
            if i % p == 0:
                flag = False
                break
        if flag:
            p_list.append(i)
    print(time() - t)
    print(p_list)

    # 方法5:定义和filter
    p_list2 = []
    t = time()
    #filter(方法,可迭代对象),将可迭代对象一个个传值给方法函数,知道传遍全部值
    filter(is_prime3, range(2, b))
    print(time() - t)
    print(p_list2)

    print ('---------------------')
    a = 2
    b = 1230
    p_list2 = []
    #filter返回值为数组,不是列表,转化为列表后才能使用len
    p = list(filter(is_prime3, range(a, b+1)))
    p_rate = float(len(p)) / float(b - a + 1)
    #上下结果相同,注意nupmy中size、shape、len用法;Counter是以字典形式返回数组中不同元素出现的个数
    #p = np.array(list(filter(is_prime3, range(a, b+1))))
    # p_rate = float(p.size) / float(b-a+1)
    print('素数的概率:', p_rate, '\t',)
    print ('公正赔率:', 1/p_rate)
    print ('合数的概率:', 1-p_rate, '\t',)
    print ('公正赔率:', 1 / (1-p_rate))

在这里插入图片描述
二、公路堵车模型
车辆其实速度为V;
若与前车距离大于当前车速,则它在下一秒的车速提高到v+1,直到达到规定的最高限速;
若与前车的距离小于当前车速,则它下 一秒的车速降低到d-1(当前距离-1) ;
车速有P的概率会减一

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

#限制函数;车辆位移受限,超出公路的汽车默认回到开头(环形公路)
def clip(x, path):
    for i in range(len(x)):
        if x[i] >= path:
            x[i] %= path

if __name__ == "__main__":
    #转换中文
    mpl.rcParams['font.sans-serif'] = [u'SimHei']
    mpl.rcParams['axes.unicode_minus'] = False

    path = 5000     # 环形公路的长度
    n = 100         # 公路中的车辆数目
    v0 = 50          # 车辆的初始速度
    p = 0.3         # 随机减速概率
    Times = 3000    #时间

    #产生相同的随机数(随机种子)
    np.random.seed(0)
    #100辆车的起始位置
    x = np.random.rand(n) * path
    #对车辆位置进行排序
    x.sort()
    # 将100个车辆的速度定义为50,并设为float类型数据
    v = np.tile([v0], n).astype(np.float)
    plt.figure(figsize=(10, 8), facecolor='w')
    #模拟在时间范围内的堵车情况
    for t in range(Times):
        #使用散点图
        plt.scatter(x, [t]*n, s=1, c='k', alpha=0.05)
        for i in range(n):
            #计算前后车距离
            if x[(i+1)%n] > x[i]:
                d = x[(i+1) % n] - x[i]   # 距离前车的距离
            else:
                d = path - x[i] + x[(i+1) % n]
            #判断此时的速度与前车距离大小
            if v[i] < d:
            #若前方可见范围内没车,则它在下一秒的车速提高到v+1,直到达到规定的最高限速。同时,每辆车会以概率p随机减速v-1。
                if np.random.rand() > p:
                    v[i] += 1
                else:
                    v[i] -= 1
            # 若前方有车,前车的距离为d,且d < v,则它下 一秒的车速降低到d-1 。
            else:
                v[i] = d - 1
        # 限制速度,v<0,则将v定义为0;v>150,则将v定义为150
        v = v.clip(0, 150)
        #车不断向前
        x += v
        # 车辆位移受限,超出公路的汽车默认回到开头(环形公路)
        clip(x, path)
    #设置x、y坐标
    plt.xlim(0, path)
    plt.ylim(0, Times)
    #设置标签
    plt.xlabel(u'车辆位置', fontsize=16)
    plt.ylabel(u'模拟时间', fontsize=16)
    plt.title(u'环形公路车辆堵车模拟', fontsize=20)
    #自动调整子图参数,使之填充整个图像区域
    plt.tight_layout(pad=2)
    plt.show()

在这里插入图片描述
三、鸢尾花数据(PCA)

import pandas as pd
import numpy as np
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegressionCV
from sklearn import metrics
from sklearn.model_selection import train_test_split
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures

def extend(a, b):
    return 1.05*a-0.05*b, 1.05*b-0.05*a

if __name__ == '__main__':
    #显示最大行数列数,超过了显示省略号
    pd.set_option('display.width', 200)
    #读取燕尾花数据
    data = pd.read_csv('iris.data', header=None)
    #重新设置列名称、属性
    columns = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'type']
    data.rename(columns=dict(zip(np.arange(5), columns)), inplace=True)
    data['type'] = pd.Categorical(data['type']).codes
    print(data.head(5))
    #划分数据(特征值和目标值)
    x = data.loc[:, columns[:-1]]
    y = data['type']
    #使用PCA进行降维处理,查看方差所占百分比,去除影响较小的特征
    pca = PCA(n_components=2, whiten=True, random_state=0)
    x = pca.fit_transform(x)
    print('各方向方差:', pca.explained_variance_)
    print('方差所占比例:', pca.explained_variance_ratio_)
    print(x[:5])

    #cm_light = mpl.colors.ListedColormap(['#77E0A0', '#FF8080', '#A0A0FF'])
    cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b'])
    #切换为中文
    mpl.rcParams['font.sans-serif'] = u'SimHei'
    mpl.rcParams['axes.unicode_minus'] = False
    plt.figure(facecolor='w')
    #绘制散点图
    plt.scatter(x[:, 0], x[:, 1], s=30, c=y, marker='o', cmap=cm_dark)
    #背景网格线
    plt.grid(b=True, ls=':')
    plt.xlabel(u'组份1', fontsize=14)
    plt.ylabel(u'组份2', fontsize=14)
    plt.title(u'鸢尾花数据PCA降维', fontsize=18)
    # plt.savefig('1.png')
    plt.show()

在这里插入图片描述

#划分训练集、测试集
x, x_test, y, y_test = train_test_split(x, y, train_size=0.7)
#机器学习模型(管道)
model = Pipeline([
    #特征选择,degree:选择线性函数次数
    ('poly', PolynomialFeatures(degree=4, include_bias=True)),
    #逻辑回归--分类
    ('lr', LogisticRegressionCV(Cs=np.logspace(-3, 4, 8), cv=5, fit_intercept=False))
])
#进行调参
model.fit(x, y)
print ('最优参数:', model.get_params('lr')['lr'].C_)
y_hat = model.predict(x)
print ('训练集精确度:', metrics.accuracy_score(y, y_hat))
y_test_hat = model.predict(x_test)
print ('测试集精确度:', metrics.accuracy_score(y_test, y_test_hat))

# 对得到的结果进行绘图,即在PCA的图形上根据分类结果对不同类别进行绘制
N, M = 500, 500     # 横纵各采样多少个值
x1_min, x1_max = extend(x[:, 0].min(), x[:, 0].max())   # 第0列的范围
x2_min, x2_max = extend(x[:, 1].min(), x[:, 1].max())   # 第1列的范围
t1 = np.linspace(x1_min, x1_max, N)
t2 = np.linspace(x2_min, x2_max, M)
x1, x2 = np.meshgrid(t1, t2)                    # 生成网格采样点
x_show = np.stack((x1.flat, x2.flat), axis=1)   # 测试点
y_hat = model.predict(x_show)  # 预测值
y_hat = y_hat.reshape(x1.shape)  # 使之与输入的形状相同

plt.figure(facecolor='w')
plt.pcolormesh(x1, x2, y_hat, cmap=cm_light)  # 预测值的显示
plt.scatter(x[:, 0], x[:, 1], s=30, c=y, edgecolors='k', cmap=cm_dark)  # 样本的显示
# 打标签
plt.xlabel(u'组份1', fontsize=14)
plt.ylabel(u'组份2', fontsize=14)
# 对x,y坐标轴的坐标进行限制
plt.xlim(x1_min, x1_max)
plt.ylim(x2_min, x2_max)
plt.grid(b=True, ls=':')
patchs = [mpatches.Patch(color='#77E0A0', label='Iris-setosa'),
          mpatches.Patch(color='#FF8080', label='Iris-versicolor'),
          mpatches.Patch(color='#A0A0FF', label='Iris-virginica')]
plt.legend(handles=patchs, fancybox=True, framealpha=0.8, loc='lower right')
plt.title(u'鸢尾花Logistic回归分类效果', fontsize=17)
# plt.savefig('2.png')
plt.show()

在这里插入图片描述

四、
排污数据异常值检测与修正

import numpy as np
import matplotlib as mpl
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import BaggingRegressor


def read_data():
    plt.figure(figsize=(13, 7), facecolor='w')
    plt.subplot(121)
    data = pd.read_csv('C0904.csv', header=0)
    x = data['H2O'].values
    plt.plot(x, 'r-', lw=1, label=u'C0904')
    plt.title(u'实际排放数据0904', fontsize=18)
    plt.legend(loc='upper right')
    plt.grid(b=True)

    plt.subplot(122)
    data = pd.read_csv('C0911.csv', header=0)
    x = data['H2O'].values
    plt.plot(x, 'r-', lw=1, label=u'C0911')
    plt.title(u'实际排放数据0911', fontsize=18)
    plt.legend(loc='upper right')
    plt.grid(b=True)

    plt.tight_layout(2, rect=(0, 0, 1, 0.95))
    plt.suptitle(u'如何找到下图中的异常值', fontsize=20)
    plt.show()


if __name__ == "__main__":
    mpl.rcParams['font.sans-serif'] = [u'simHei']
    mpl.rcParams['axes.unicode_minus'] = False

    # read_data()
    data = pd.read_csv('C0904.csv', header=0)   # C0911.csv, C0904.csv
    x = data['H2O'].values
    print (x)

    width = 500
    delta = 10
    eps = 0.15
    N = len(x)
    p = []
    abnormal = []
    for i in np.arange(0, N-width, delta):
        s = x[i:i+width]
        p.append(np.ptp(s))
        if np.ptp(s) > eps:
            abnormal.append(range(i, i+width))
    abnormal = np.array(abnormal).flatten()
    abnormal = np.unique(abnormal)
    # plt.plot(p, lw=1)
    # plt.grid(b=True)
    # plt.show()

    plt.figure(figsize=(18, 7), facecolor='w')
    plt.subplot(131)
    plt.plot(x, 'r-', lw=1, label=u'原始数据')
    plt.title(u'实际排放数据', fontsize=18)
    plt.legend(loc='upper right')
    plt.grid(b=True)

    plt.subplot(132)
    t = np.arange(N)
    plt.plot(t, x, 'r-', lw=1, label=u'原始数据')
    plt.plot(abnormal, x[abnormal], 'go', markeredgecolor='g', ms=3, label=u'异常值')
    plt.legend(loc='upper right')
    plt.title(u'异常检测', fontsize=18)
    plt.grid(b=True)

    # 预测
    plt.subplot(133)
    select = np.ones(N, dtype=np.bool)
    select[abnormal] = False
    t = np.arange(N)
    dtr = DecisionTreeRegressor(criterion='mse', max_depth=10)
    br = BaggingRegressor(dtr, n_estimators=10, max_samples=0.3)
    br.fit(t[select].reshape(-1, 1), x[select])
    y = br.predict(np.arange(N).reshape(-1, 1))
    y[select] = x[select]
    plt.plot(x, 'g--', lw=1, label=u'原始值')    # 原始值
    plt.plot(y, 'r-', lw=1, label=u'校正值')     # 校正值
    plt.legend(loc='upper right')
    plt.title(u'异常值校正', fontsize=18)
    plt.grid(b=True)

    plt.tight_layout(1.5, rect=(0, 0, 1, 0.95))
    plt.suptitle(u'排污数据的异常值检测与校正', fontsize=22)
    plt.show()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值