• 机器学习


    机器学习

    1. 机器学习的引入

    城市气候与海洋的关系研究 :

    导入包 :

    import numpy as np
    import pandas as pd
    from pandas import Series,DataFrame
    
    import matplotlib.pyplot as plt
    %matplotlib inline
    
    
    from pylab import mpl
    mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体
    mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
    

    导入数据 :

    ferrara1 = pd.read_csv('./ferrara_150715.csv')
    ferrara2 = pd.read_csv('./ferrara_250715.csv')
    ferrara3 = pd.read_csv('./ferrara_270615.csv')
    ferrara=pd.concat([ferrara1,ferrara2,ferrara3],ignore_index=True)
    # ignore_index=True 表示的是忽略显式的行索引
    ...
    

    删除没用的列 :

    # 循环删除每个表的'Unnamed: 0'列
    city_list = [ferrara,torino,mantova,milano,ravenna,asti,bologna,piacenza,cesena,faenza]
    for city in city_list:
        city.drop(labels='Unnamed: 0',axis=1,inplace=True) # 加入inplace=True就会改写源数据
    

    部分数据 :

    temp humidity pressure description dt wind_speed wind_deg city day dist
    0 29.40 83 1015 moderate rain 1436863177 3.62 94.001 Faenza 2015-07-14 10:39:37 37
    1 30.12 78 1015 moderate rain 1436866759 3.10 80.000 Faenza 2015-07-14 11:39:19 37

    显示最高温度于离海远近的关系(观察多个城市):

    max_temp = [] #10个城市的最高温度
    cities_dist = [] #10个城市距离海洋的距离
    
    for city in city_list:
        max_temp.append(city['temp'].max())
        cities_dist.append(city['dist'].max())
    
    • 在方程式中:
      • x:自变量
      • y:因变量
      • y = 5x + 4
      • 自变量的变化会导致因变量的变化

    生成散点图 :

    plt.scatter(cities_dist,max_temp,c='rbyg') # c='rbyg'表示颜色
    plt.xlabel('距离')
    plt.ylabel('最高温度')
    plt.title('距离和最高温度之间的关系图')
    
    # 基于当前的关系模式将某一个未知最高温度的城市的最高温度进行预测
    

    机器学习

    1. 机器学习 - 线性回归算法模型

    • 机器学习(ML)和人工智能之间的关系是什么?
      • 机器学习是实现人工智能的一种技术手段
    • 什么是算法模型(model或者m)?
      • 特殊的对象。特殊之处就在于该对象内部集成了某一种还没有求出解的方程。
    • 算法模型的作用?
      • 实现预测:预测出一个未知的结果
      • 实现分类:将一个未知分类的事务归类到已知的类群中
      • 重点:算法模型中的方程的解就是预测或者分类的结果
    • 样本数据
      • 作用:将样本数据带入到算法模型中让其内部的方程有解。至此算法模型就可以实现分类或者预测的功能。
      • 训练模型:将样本数据带入到算法模型中让其内部的方程有解。只有训练好的算法模型才可以实现分类或者预测的功能!
      • 组成部分:
        • 特征数据:自变量
        • 目标数据:因变量
    • sk-learn库:封装了大量的算法模型
    • 模型的分类:
      • 有监督学习:如果模型需要的样本数据必须包含特征数据和目标数据
      • 无监督学习:如果模型需要的样本只需要有特征数据

    导入sklearn,建立线性回归算法模型对象

    • 该模型内部封装的是一个线性方程:y = wx + b
    1. 提取样本数据(特征数据,目标数据)

      feature = np.array(cities_dist)  #特征数据 
      feature = feature.reshape(-1, 1) #二维形式的特征数据
      target =  np.array(max_temp)     #目标数据
      

      训练模型调用的方法是fit(X,y),y任意形式(维度)的目标数据,X表示的必须是二维的特征数据

    2. 选择一个模型对象进行实例化

      from sklearn.linear_model import LinearRegression
      linner = LinearRegression()
      
    3. 训练模型

      linner.fit(feature,target) # X,y X必须是二维的特征数据
      
    4. 使用相关的评价指标来评价模型

      linner.score(feature,target)
      
    5. 实现预测

      linner.predict([[222],[333]])  
      

    画出回归曲线 :

    x = np.linspace(0,350,num=100)
    y = linner.predict(x.reshape(-1,1))
    plt.scatter(cities_dist,max_temp,c='rbyg')
    plt.xlabel('距离')
    plt.ylabel('最高温度')
    plt.title('距离和最高温度之间的关系图')
    
    plt.scatter(x,y)
    

    2. K-近邻算法(KNN)

    1. k-近邻算法原理

    简单地说,K-近邻算法采用测量不同特征值之间的距离方法进行分类。
    - 优点:精度高(计算距离)、对异常值不敏感(单纯根据距离进行分类,会忽略特殊情况)、无数据输入假定(不会对数据预先进行判定)。
    - 缺点:时间复杂度高、空间复杂度高。
    - 适用数据范围:数值型和标称型。
    

    2. 在scikit-learn库中使用k-近邻算法

    用于分类 :

    导包,机器学习的算法KNN、数据蓝蝴蝶

    import sklearn.datasets as datasets
    datasets.load_iris()  # datasets提供了不同的样本数据,根据不同的样本数据训练出来,就将会有不同的功能
    

    预测年收入是否大于50K美元 :

    读取adult.txt文件,最后一列是年收入,并使用KNN算法训练模型,然后使用模型预测一个人的年收入是否大于50

    # 读取数据
    import pandas as pd
    import numpy as np
    data = pd.read_csv('../data/adults.txt')
    data.head()
    

    部分数据展示

    age workclass final_weight education education_num marital_status occupation relationship race sex capital_gain capital_loss hours_per_week native_country salary
    0 39 State-gov 77516 Bachelors 13 Never-married Adm-clerical Not-in-family White Male 2174 0 40 United-States <=50K
    1 50 Self-emp-not-inc 83311 Bachelors 13 Married-civ-spouse Exec-managerial Husband White Male 0 0 13 United-States <=50K

    获取年龄、教育程度、职位、每周工作时间作为机器学习数据
    获取薪水作为对应结果

    feature = data[['age','education_num','occupation','hours_per_week']]
    target = data['salary']
    

    knn中特征数据是需要参与运算的,所以要保证特征数据必须为数值型的数据

    feature.head(2)

    age education_num occupation hours_per_week
    0 39 13 Adm-clerical 40
    1 50 13 Exec-managerial 13

    数据转换,将String类型数据转换为int (occupation转换成数字)

    # map方法,进行数据转换
    dic = {}
    occ_arr = feature['occupation'].unique()
    for i in range(occ_arr.size):
        dic[occ_arr[i]] = i
    feature['occupation'] = feature['occupation'].map(dic)
    

    切片:训练数据和预测数据

    #训练数据
    x_train = feature[:32500]
    y_train = target[:32500]
    #测试数据
    x_test = feature[32500:]
    y_test = target[32500:]
    

    生成算法

    from sklearn.neighbors import KNeighborsClassifier
    knn = KNeighborsClassifier(n_neighbors=10)  # n_neighbors调整精度用的K
    knn.fit(x_train,y_train)
    knn.score(x_test,y_test)
    

    第二步:预测数据

    print('真实的分类结果:',np.array(y_test))
    print('模型的分类结果:',knn.predict(x_test))
    

    3. KNN手写数字识别

    导包

    import numpy as np
    import matplotlib .pyplot as plt 
    import pandas as pd
    from sklearn.neighbors import KNeighborsClassifier
    

    加载数据

    #./data/6/6_66.bmp
    feature = []
    target = []
    for i in range(10): #i表示的文件夹的名称
        for j in range(1,501):
            img_path = './data/'+str(i)+'/'+str(i)+'_'+str(j)+'.bmp'
            img_arr = plt.imread(img_path)
            feature.append(img_arr)
            target.append(i)
    

    提取样本数据

    feature = np.array(feature)  #必须保证是二维
    target = np.array(target)
    feature.shape  # (5000, 28, 28) 目前的特征是3维
    

    特征处理:将三维的特征变形成二维

    feature = feature.reshape((5000,-1))
    feature.shape  # (5000, 784)
    

    对样本数据进行拆分

    #对样本数据进行打乱
    # 利用random进行随机打乱且固定随机因子,使数据保持对应关系
    np.random.seed(10)
    np.random.shuffle(feature)
    np.random.seed(10)
    np.random.shuffle(target)
    
    #拆分
    x_train = feature[:4950]
    y_train = target[:4950]
    x_test = feature[4950:]
    y_test = target[4950:]
    

    实例化模型对象,然后对其进行训练

    knn = KNeighborsClassifier(n_neighbors=5)
    knn.fit(x_train,y_train)
    knn.score(x_test,y_test)
    

    测试数据

    print('真实的分类结果:',y_test)
    print('模型的分类结果:',knn.predict(x_test))
    

    保存模型

    from sklearn.externals import joblib
    joblib.dump(knn,'./knn.m')
    


    使用模型识别外部的数字图片

    读取模型

    knn = joblib.load('./knn.m')
    knn
    

    读取需要识别的图片

    img_arr = plt.imread('./数字.jpg')
    plt.imshow(img_arr)
    
    img_arr.shape # (241, 257, 3) 三维
    

    裁切图片

    eight_img = img_arr[180:235,90:130,:]
    plt.imshow(eight_img)
    
    feature[0].shape  # (784,)
    

    模型可以识别的图片的维度是取决于样本数据的

    • 可以识别的图片是28*28像素
    • 图片是没有颜色这个维度
    • 模型识别的图片(784,)

    降维

    eight_img.shape #  (55, 40, 3)
    eight_img = eight_img.mean(axis=2)
    eight_img.shape # (55, 40)
    

    对降维之后的图片的像素进行等比例压缩

    import scipy.ndimage as ndimage
    eight_img = ndimage.zoom(eight_img,zoom=(28/55,28/40))
    eight_img.shape # (28, 28)
    
    eight_img = eight_img.reshape(1,-1)
    eight_img.shape # (1,784)
    

    识别

    knn.predict(eight_img) # array([8])
    
  • 相关阅读:
    geoserver 地图性能和缓存
    geoserver PostGIS的安装和使用
    geoserver 数据图层输出格式
    Centos7Yum安装配置指定版本nginx
    Centos7Yum安装PHP7.2
    CentOS7 中把默认yum源更换成163源
    安装配置Elasticserch的方法
    redis的持久化(RDB&AOF的区别)
    LayerDate渲染多个class出现闪现问题的解决
    explain分析SQL语句详解
  • 原文地址:https://www.cnblogs.com/qmuy/p/11700814.html
Copyright © 2020-2023  润新知