PythonStudy4

一、前言

无论怎么选择数据特征都难以得到一个高的分类率. 最后在看方差和标准差的时候, 发现数据不同特征的这两个值不在一个数量级上.

这都是自己没有做归一化导致的结果, 所以这里尝试归一化之后再来进行训练.

二、归一化

1. 概念

在机器学习领域中, 不同评价指标 (即特征向量中的不同特征就是所述的不同评价指标) 往往具有不同的量纲和量纲单位, 这样的情况会影响到数据分析的结果, 为了消除指标之间的量纲影响, 需要进行数据标准化处理, 以解决数据指标之间的可比性.

原始数据经过数据标准化处理后, 各指标处于同一数量级, 适合进行综合对比评价. 其中, 最典型的就是数据的归一化处理.

2. 方法

  1. 最大最小标准化 (Min-Max Normalization)

    x ′ = x − min ⁡ ( x ) max ⁡ ( x ) − min ⁡ ( x ) x' = \frac{x - \min(x)}{\max(x) - \min(x)} x=max(x)min(x)xmin(x)

    线性函数将原始数据线性化的方法转换到 [0 1] 的范围, 计算结果为归一化后的数据, x 为原始数据

    本归一化方法比较适用在数值比较集中的情况

  2. z—score 标准化

    x ∗ = x − μ σ x^* = \frac{x - \mu}{\sigma} x=σxμ

    其中, μ \mu μ σ \sigma σ 分别是原始数据集的均值和方差.

    将原始数据集归一化为均值为0、方差1的数据集

    该种归一化方式要求原始数据的分布可以近似为高斯分布, 否则归一化的效果会变得很糟糕

3. 归一化代码

我还是选择最简单的最大最小标准化, 使用 sklearn 库的 preprocessing 就能够很好完成.

from sklearn import preprocessing

min_max_scaler = preprocessing.MinMaxScaler()
#标准化训练集数据
data_train_nomal = min_max_scaler.fit_transform([[1,2,3,4,5],[2,3,4,5,6],[3,4,5,6,7]])

print(data_train_nomal)

输入 : 一个矩阵

[[1. 2. 3. 4. 5. ]
 [2. 3. 4. 5. 6. ]
 [3. 4. 5. 6. 7. ]]

输出 : 归一化后的矩阵

[[0.  0.  0.  0.  0. ]
 [0.5 0.5 0.5 0.5 0.5]
 [1.  1.  1.  1.  1. ]]

三、训练

由于是在 Jupyter Notebook 里面写的, 所以代码就分段展示

读取数据的代码

import os

files = []

def Getfile(path):
    files_list = os.listdir(path)

    for file_name in files_list:
        file_absolute_path = os.path.join(path,file_name)
        if os.path.isdir(file_absolute_path):
            Getfile(file_absolute_path)
        else:
            if file_absolute_path.rsplit('.')[-1] == 'xlsx':
                files.append(file_absolute_path)

Getfile(r"D:\Work\Data\welldata")

处理数据的代码

import pandas as pd

feature = []
label = []

for file in files:
    useful_file = False
    
    if pd.read_excel(file).shape[1] == 28:
        useful_file = True
    else:
        useful_file = False

    if useful_file:
        # Get column 5-24 and add column 27 
        columns = list(range(5,25))
        columns.append(27)
        data = pd.read_excel(file, usecols=columns,names=None)
        df = data.values.tolist()

        for i in range(len(df)):
            feature.append(df[i][:-1])

            if df[i][-1] == "差气层":
                label.append(0)
            elif df[i][-1] == "干层":
                label.append(1)
            elif df[i][-1] == "气层":
                label.append(2)
            else:
                feature.pop()
    else:
        continue

归一化的代码

from sklearn import preprocessing

min_max_scaler = preprocessing.MinMaxScaler()

feature = min_max_scaler.fit_transform(feature)

分割数据集的代码

from sklearn.model_selection import train_test_split

feature_train_set,feature_test_set,label_train_set,label_test_set = train_test_split(feature,label)

训练的代码

from sklearn.neighbors import KNeighborsClassifier

sklearn_knn_clf = KNeighborsClassifier(n_neighbors=7)

sklearn_knn_clf.fit(feature_train_set,label_train_set)

sklearn_knn_clf.score(feature_test_set,label_test_set)

分类准确率

这是调整了 KNN 对邻居要求的个数并且选择的是多次训练结果中最高的识别率.

四、其他算法

尝试了贝叶斯分类器, 结果更差

决策树相比 KNN 的效果要好些, 但是还是达不到高识别率

五、总结

相比之前有了很大提升, 但是始终无法使正确率到达 85% 甚至是 90% 以上. 修改归一化规则对结果也是大差不差.

那么对我来说, 要么是对数据把握不到位, 要么就要尝试使用神经网络之类的算法来处理这个问题.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学习Python是一个很好的选择!以下是一些学习Python的步骤和资源推荐: 1. 学习基本语法:开始学习Python之前,先了解Python的基本语法、变量、数据类型、条件语句、循环语句等基础知识。可以通过在线教程、书籍或视频教程来学习。 2. 练习编写代码:通过实践来巩固所学的知识。尝试编写一些简单的程序,如打印输出、求解数学问题、处理字符串等,逐渐提升编程能力。 3. 掌握常用模块和库:Python有丰富的标准库和第三方库可供使用,如NumPy、Pandas、Matplotlib等。学习并熟悉常用的模块和库,可以提升开发效率和功能实现能力。 4. 参与项目或实战练习:找一些小项目或实战练习来应用所学知识,这样可以更好地理解和掌握Python的实际应用。 5. 加入社区和讨论组:Python有活跃的社区和讨论组,在这里可以与其他开发者交流、分享经验和寻求帮助。参与讨论和项目合作,可以提高自己的编程水平。 以下是一些学习Python的资源推荐: - 官方文档:Python官方网站提供了详细的文档和教程,可以从官方网站获取相关信息:https://www.python.org/ - 在线教程:有很多在线教程可以帮助你快速入门Python,如Codecademy、w3schools、Python官方教程等。 - 书籍:一些经典的Python学习书籍包括《Python编程从入门到实践》、《流畅的Python》、《Python核心编程》等。 - 网络资源:在网上有很多Python的学习资源,如视频教程、博客、论坛等,可以通过搜索引擎找到相关资源。 无论选择哪种学习方式,坚持练习和不断实践是学习Python的关键。祝你学习愉快!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值