机器学习之数据分析

1.机器学习

让机器通过已有的数据进行学习,然后用学到的知识对新数据进行预测

大体分为三类:回归、分类、聚类

回归:预测某个数值

分类:预测属于哪个类别

聚类:自动进行分类

一.第一轮数据清洗

1.数据处理----缺失值(空值)

对于数据中的空值的处理方法:

(1)直接删除(大多数情况不建议,因为只缺失某项值但它其他的值是有意义的)

(2)填充。填充平均值或者中位数(实际操作中填充中位数比较好,因为均值易受特殊值得影响(比如小明收入0元但和马云的平均财产也很高))

2.独特率

上图饮食习惯的独特率为3,即饮食习惯中只有三种不同类型的东西

二.第二轮数据清洗

1.异数

就是异常值,明显偏离整体数据的数据值。例:求均值时极大值对均值的影响,极大值就是异数

2.相关度检验

两个特征例:是男生吗,是女生吗这两个变量相当于重复了,

相关度很大的两个变量要删掉一个

三.数据分析三剑客

1.numpy

numpy是Python中做科学计算的基础库。重点 在于数值计算,也是大部分Python科学计算库的基础,多用于在大型、多维数组的数值计算

(1)numpy的创建

  • 使用np.array()创建
  • 使用plt创建
  • 使用np的routines创建

使用np.array()创建一个一维数组

import numpy as np
arr1=np.array([1,2,3,4,5,6])
print(arr1)

使用np.array()创建一个多维数组

import numpy as np
arr2=np.array([[123,456,789],[1,2,3]])
print(arr2)

数组和列表的区别:

数组中只可以存储相同类型的元素

如果数组中出现了不同类型的元素,则根据数据类型的优先级会将不同类型的数据转换为相同类型的数据(数据的优先级::字符串>浮点型>整形

 (2)numpy的索引和切片

'''numpy索引操作'''
import numpy as np
arr=np.random.randint(0,100,size=(4,5))   #用random.randint(a,b)生成随机数包括范围的两个端点,size:生成4行5列的数
print(arr)
'''结果[[64 28 83 25  9]  索引为0
 [25 49 17 72  2]         索引为 1
 [ 2 24 27  8 21]
 [71  6 52 55 85]]'''
print(arr[1])   #结果[25 49 17 72  2]
print(arr[1][3])   #结果72
'''numpy切片操作'''
import numpy as np
arr1=np.random.randint(0,100,size=(5,6))
print(arr1)
#切行
print(arr1[0:3])
#切列
print(arr1[:,0:3])
#即切行又切列
print(arr1[0:3,0:3])

(3)变形reshape

注意:变形前和变形后数组的容量不可以发生变化(容量不能发生变化指:一维是9个元素,变成二维之后也得是九个元素)

import numpy as np
arr=np.array([1,2,3,4,5,6,7,8,9])
print(arr)
#将一维变成二维
arr1 = arr.reshape((3,3))   #三行三列
arr2 = arr.reshape((1,9))   #一行九列
arr3 = arr.reshape((9,1))   #九行一列
print(arr1)
print(arr2)
print(arr3)
'''不管九行一列还是一行九列,总之容量不能改变'''
#将二维变成一维
arr4 = arr1.reshape(1,9)
print(arr4)

 线性回归中用

X_train = X_train.values.reshape(-1,1)将数据转化成一列的原因:

 (4)级联操作

                         ---将多个numpy数组进行横向或者纵向的拼接

axis轴向:0表示按列拼接,1表示按行拼接

arr1 = np.random.randint(0,100,size=(3,4))         #用random.randint(a,b)生成随机数包括范围的两个端点,size:生成3行4列的数
arr2 = np.random.randint(0,100,size=(2,4))
#匹配级联:级联的数组形状一致(行数列数一样)
a=np.concatenate((arr1,arr1),axis=0)               #axis=0表示按列拼接,axis=1表示按行拼接
b=np.concatenate((arr1,arr1),axis=1)
print('按列拼接:\n',a)
print('按行拼接:\n',b)
#不匹配级联:行数列数有一个不同,则只能按相同的那个轴向进行拼接,如:arr1和arr2只能按列进行拼接,按行拼接报错
c=np.concatenate((arr1,arr2),axis=0)
print('按列拼接:\n',c)

结果:

注,random.randint(a,b)生成的是随机数,所以每次运行结果可能不一样

(6)矩阵相关

熟悉基本的矩阵操作:创建矩阵、矩阵转置、矩阵的乘法等

矩阵的转置   .T

#矩阵的转置
import numpy as np
arr1=np.random.randint(0,100,size=(3,5))
print(arr1)
arr2=arr1.T             #.T表示矩阵的转置
print(arr2)

矩阵的加法、减法:每个位置元素应相加减

一个数乘以一个矩阵:用这个数与矩阵中的每个元素分别相乘

矩阵的乘法:(矩阵乘矩阵)

2.pandas

 

(1)基于pandas的数据清洗

首先导入模块:

import numpy as np
import pandas as pd
from pandas import DataFrame

创建一个列表,并制造空值 

import numpy as np
import pandas as pd
from pandas import DataFrame
#创建一个列表
df=DataFrame(data=np.random.randint(0,100,size=(10,8)))
#人为给列表制造空值(实际应用中数据是从外部导入的,这里为演示人为制造空值)
df.iloc[3,3]=np.nan
df.iloc[4,5]=np.nan
df.iloc[6,6]=np.nan
print(df)
空值的处理:

  pandas处理空值的操作:

  • isnull
  • notnull
  • any
  • all
  • dropna
  • fillna

  • 方式一:对空值进行过滤(删除空所在的行数据)(比较麻烦一般不用,一般用方式二)

        技术:isnull,         notnull,         any,         all      

import numpy as np
import pandas as pd
from pandas import DataFrame
#创建一个列表
df=DataFrame(data=np.random.randint(0,100,size=(10,8)))
#人为给列表制造空值(实际应用中数据是从外部导入的,这里为演示人为制造空值)
df.iloc[3,3]=np.nan
df.iloc[4,5]=np.nan
df.iloc[6,6]=np.nan
print(df)

'''isnull和any结合删除表格中有空值的行'''
#any作用到df.isnull()返回的DataFrame的行中
#any的作用:检测一组数据中是否存有True,如果有则返回True否则返回False
print(df.isnull().any(axis=1))   #axis=1检测哪行有空,axis=0检测哪列有空

ex=df.isnull().any(axis=1)#将检测出有空值的行的行号赋值给ex
print(df.loc[ex])   #将有空值的行打印出来(ex中已有行号)。df.loc[]可以查询数据

#输出有空值行的索引
null_row_index = df.loc[ex].index
print(null_row_index)

#删除有空值的行,并把剩余行输出
print(df.drop(labels=null_row_index,axis=0))

结果:

注意:notnull和all结合类似

 方式二:dropna:可以直接将缺失的行或列进行删除
import numpy as np
import pandas as pd
from pandas import DataFrame
#创建一个列表
df=DataFrame(data=np.random.randint(0,100,size=(10,8)))
#人为给列表制造空值(实际应用中数据是从外部导入的,这里为演示人为制造空值)
df.iloc[3,3]=np.nan
df.iloc[4,5]=np.nan
df.iloc[6,6]=np.nan
print(df)

a=df.dropna(axis=0)   #axis=0表示将空值所在行删除
print(a)

b=df.dropna(axis=1)   #axis=1表示将空值所在列删除
print(b)

结果:

注意:方式二相当于对方式一的封装,比方式一简洁

方式三:对缺失值进行覆盖(fillna)

注意:该方法是使用任意值(666)填充空值,即所有空值都填充同一个值,这种意义不大,一般不常用。

用任意值填充空值
import numpy as np
import pandas as pd
from pandas import DataFrame
#创建一个列表
df=DataFrame(data=np.random.randint(0,100,size=(10,8)))
#人为给列表制造空值(实际应用中数据是从外部导入的,这里为演示人为制造空值)
df.iloc[3,3]=np.nan
df.iloc[4,5]=np.nan
df.iloc[6,6]=np.nan
print(df)

#用fillna对缺失值进行覆盖
print(df.fillna(value=666))

结果:

使用近邻值填充空值
import numpy as np
import pandas as pd
from pandas import DataFrame
#创建一个列表
df=DataFrame(data=np.random.randint(0,100,size=(10,8)))
#人为给列表制造空值(实际应用中数据是从外部导入的,这里为演示人为制造空值)
df.iloc[3,3]=np.nan
df.iloc[4,5]=np.nan
df.iloc[6,6]=np.nan
print(df)

#使用近邻值填充空值
#method:ffill(用前面的值填充),bfill(用后面的值填充) axis=0表示用列方向,axis=1表示用行方向。
print(df.fillna(method='ffill',axis=0))   #用列方向前面的数值填充空值

#用邻近值填充的特殊情况,假设用列前面的数值填充,空值在第一行(即它列方向前面没有值),处理方法如下
print(df.fillna(method='ffill',axis=0).fillna(method='bfill',axis=0))   #列方向前面没有值时用列方向后面的值,这样能保证所有空值都能填上
检测空值的个数

原理:

isnull()作用:非空显示为False,空值显示为True,False为0,True为1.则用sum()求每行或每列的和,若值为0说明全是False相加,即该行或该列全是非空值。若值为1说明有一个True,值为2说明有两个True,以此类推,能检测空值个数
import numpy as np
import pandas as pd
from pandas import DataFrame
#创建一个列表
df=DataFrame(data=np.random.randint(0,100,size=(10,8)))
#人为给列表制造空值(实际应用中数据是从外部导入的,这里为演示人为制造空值)
df.iloc[3,3]=np.nan
df.iloc[4,5]=np.nan
df.iloc[6,6]=np.nan
print(df)

#检测df中空值的个数
#isnull()作用:非空显示为False,空值显示为True。sum()是求和,axis是控置按行还是按列
a=df.isnull().sum(axis=0)   #按列求和,只要不是0说明该列有空值(因为结果为0->是所有False相加->所有值非空)(结果不为0->是True相加->该列有空值)
b=df.isnull().sum(axis=1)   #按行求和,只要不是0说明该行有空值
print(a)
print(b)

使用空值对应列的均值填充空值
import numpy as np
import pandas as pd
from pandas import DataFrame
#创建一个列表
df=DataFrame(data=np.random.randint(0,100,size=(10,8)))
#人为给列表制造空值(实际应用中数据是从外部导入的,这里为演示人为制造空值)
df.iloc[3,3]=np.nan
df.iloc[4,5]=np.nan
df.iloc[6,6]=np.nan
print(df)

#使用空值对应列的均值进行空值填充
#判断遍历的该列中是否存在空值
for col in df.columns:                  #df.columns返回列标签
    if df[col].isnull().sum()>0:        #如果>0说明存在空值
        mean_value = df[col].mean()     #df[col].mean() 求该列的均值
        df[col].fillna(value=mean_value,inplace=True)   #用均值填充该列的空值
print(df)
处理重复数据
方式一:(先检测重复行,再对重复行进行取反打印)(太麻烦,不常用)
#导入相关模块
import numpy as np
import pandas as pd
from pandas import DataFrame
#创建一个列表
df=DataFrame(data=np.random.randint(0,100,size=(8,4)))
print(df)
#人为给列表制造重复值(实际应用中数据是从外部导入的,这里为演示人为制造重复值)
df.iloc[2]=[1,1,1,1]
df.iloc[4]=[1,1,1,1]
df.iloc[6]=[1,1,1,1]
print(df)

#检测df中哪些行数据是重复的
print(df.duplicated())   #以True的形式返回重复行,在所有重复行中默认保留第一行重复数据,其余重复用True表示出

#~df.duplicated():对重复行进行取反得到不重复行,df.loc[]输出每行数据
print(df.loc[~df.duplicated()])
'''
经过以上操作所有重复行只保留了一个(不能把重复行全删,保留一行也能保证不重复)并且打印了去除重复数据的所有行
'''
方式二:(用df.drop_duplicates()方法,检测重复行加删除一起执行,直接出结果,常用)
#导入相关模块
import numpy as np
import pandas as pd
from pandas import DataFrame
#创建一个列表
df=DataFrame(data=np.random.randint(0,100,size=(8,4)))
print(df)
#人为给列表制造重复值(实际应用中数据是从外部导入的,这里为演示人为制造重复值)
df.iloc[2]=[1,1,1,1]
df.iloc[4]=[1,1,1,1]
df.iloc[6]=[1,1,1,1]
print(df)


#将重复行删除
print(df.drop_duplicates())

处理异常数据
  • 自定义一个1000行3列(A,B,C)取值范围为0-1的数据源,然后将异常值设置为C列中大于其两倍标准差的值为异常值,对异常值进行清洗
#导入相关模块
import numpy as np
import pandas as pd
from pandas import DataFrame

#np.random.random():随机生成浮点数,范围0-1之间。size:定义行列值。columns:定义列名
df=DataFrame(data=np.random.random(size=(1000,3)),columns=['A','B','C'])
print(df)

#两倍标准差的值
twice_std=df['C'].std()*2
print(twice_std)

#判定异常值的条件
ex = df['C'] > twice_std

#过滤异常值对应的行数据
print(df.loc[~ex])   #ex是异常值加~表示取反即正常值

(2)pandas高级操作

pandas替换操作

代码解释:

import numpy as np
import pandas as pd
from pandas import DataFrame

#创建一组数据
df=DataFrame(data=np.random.randint(0,20,size=(8,5)))
print(df)

#全局替换,将满足条件的所有数据都进行替换
df.replace(to_replace=1,value='one')   #to_replace:要替换的数据。value:用于替换的新的值

#多值替换:将多个值替换成指定形式
df.replace(to_replace={1:'one',3:'three'})   #用字典的形式,把1替换成one,3替换成three

#指定列的替换
df.replace(to_replace={1:1},value='one')   #将第一行的1替换成one,其他行的1不做变换
pandas映射操作:

 注:映射关系列表一般是字典

import numpy as np
import pandas as pd
from pandas import DataFrame

dic={
    'name':['张三','李四','王五','张三'],
    '薪资':[5000,6000,5500,5000]
}
df=DataFrame(data=dic)
print(df)

#映射关系表
dic={
    '李四':'jerry',
    '王五':'jack',
    '张三':'tom',
}
别名=df['name'].map(dic)
df['别名']=别名
print(df)

 结果:

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python机器学习数据分析预测可视化系统是一个基于Python编程语言的工具,用于处理和分析大量的数据,并通过机器学习算法进行预测和可视化展示。 首先,这个系统可以使用Python中的各种数据处理库(如Pandas、NumPy、SciPy等)来处理大规模的数据集。这些库提供了丰富的函数和方法,方便用户进行数据清洗、处理和转换,以便进一步的分析。 其次,机器学习算法是该系统的重要组成部分。Python提供了强大的机器学习库(如Scikit-learn、TensorFlow、Keras等),可以使用这些库中的各种算法来构建和训练机器学习模型。这些算法包括回归、分类、聚类、降维等,用于根据已有的数据来预测新的数据,并提供潜在的模式和趋势。 此外,该系统还提供了丰富的可视化工具,使用户可以通过图表、图像和动画来呈现数据和分析结果。Python的可视化库(如Matplotlib、Seaborn、Plotly等)提供了多种可视化方式,配合数据分析和预测模型的结果,可以直观地展示数据的特征和变化趋势,帮助用户更好地理解和解释数据。 最后,这个系统还具备灵活性和扩展性。Python作为一种开源的编程语言,有着庞大的社区支持和丰富的第三方库,用户可以根据自己的需求扩展和定制系统功能。此外,Python还具备跨平台的特性,可以在不同操作系统上运行。 综上所述,Python机器学习数据分析预测可视化系统是一种方便、强大和灵活的工具,可以帮助用户高效地处理和分析大规模的数据,并通过机器学习算法进行预测,并通过可视化方式直观地展示分析结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值