机器学习入门
1. 数据集
一般来说,机器学习中用的数据集时来自文件,比较少来自数据库。在数据库中如MySQL容易遇到性能瓶颈,读取速度比较慢。另外MySQL格式不太符合机器学习要求数据的格式。
强大的工具——Pandas,读取和数据工具,是基于numpy的。Python是动态语言比较慢,numpy速度比较快。原因是全局解释性锁(GIL)。全局解释器锁,作用就是,限制多线程同时执行,保证同一时间内只有一个线程在执行。numpy开启的是真正的多线程,即多个线程并行的执行,numpy把GIL释放了。
数据集的来源:
- Scikit-Learn:数据量小,方便学习;
- UCI:收录360个数据集,收录了360个数据集,覆盖科学、生活、经济等领域,数据量几十万;
- Kaggle:大数据竞赛平台,80万科学家,真实数据,数据量巨大。
机器学习中大多数数据是由特征和目标组成的。
2. 特征工程
特征工程:特征工程是将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的模型准确性。
- pandas:一个数据读取非常方便以及基本的处理格式的工具;
- sklearn:对于特征的处理提供了强大的接口。
2.1 Scikit-Learn
2.1.1 字典特征抽取
from sklearn.feature_extraction import DictVectorizer
def dictvec():
#将DictVectorizer()实例化,对字典数据进行特征值化
dict = DictVectorizer(sparse=False)
#调用fit_tranform
data = dict.fit_transform([{'city':'北京','temperature':100},
{'city':'上海','temperature':60},
{'city':'深圳','temperature':30}])
print(data) #输出为sparse矩阵
return None
if __name__ == "__main__":
dictvec()
DictVectorizer()中sparse中的值默认为true.
DictVectorizer()中sparse中的值默认为true.数组形式,有类别特征。采用的是one-hot编码
sparse矩阵有利于节约内存,方便读取处理,只将非0值的位置和值展示出来。
DictVectorizer.fit_transform(X)
X:字典或者包含字典的迭代器
返回值:返回sparse矩阵
DictVectorizer.inverse_transform(X)
X:array数组或者sparse矩阵
返回值:转换之前数据格式
DictVectorizer.get_feature_names()
返回类别名称
DictVectorizer.transform(X)
按照原先的标准转换
2.2 文本特征抽取
#对文本进行特征值化
def countvec():
cv = CountVectorizer()
data = cv.fit_transform(["life life is short,i like python","life is too long,i dislike python"])
print(cv.get_feature_names())
# print(data)
#固定的方法,把sparse矩阵转化为数组形式
print(data.toarray())
return None
'''输出:
['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
[[0 1 2 1 0 1 1 0]
[1 1 1 0 1 1 0 1]]
'''
- 统计所有文章当中所有的词,重复的只看做一次;
- 对每篇文章,在词的列表里面进行统计每个词出现的次数;
- 单个字母不统计!因为一个字母没有文本主题的倾向,无分类依据。
CountVectorizer(max_df=1.0,min_df=1,…)
返回词频矩阵
CountVectorizer.fit_transform(X,y)
X:文本或者包含文本字符串的可迭代对象
返回值:返回sparse矩阵
CountVectorizer.inverse_transform(X)
X:array数组或者sparse矩阵
返回值:转换之前数据格式
CountVectorizer.get_feature_names()
返回值:单词列表
例子:对三段话进行特征值化——流程
- 准备句子,利用jieba.cut进行分词
- 实例化CountVectorizer
- 将分词结果变成字符串当作fit_transform的输入值
def cutword():
con1 = jieba.cut("今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。")
con2 = jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。")
con3 = jieba.cut("如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。")
print('con1 = ')
print(type(con1))
#转换成列表
content1 = list(con1)
content2 = list(con2)
content3 = list(con3)
print('content1 = ')
print(content1)
print(type(content1))
#把列表转换成字符串
c1 = ' '.join(content1)
c2 = ' '.join(content2)
c3 = ' '.join(content3)
print('c1 = ')
print(type(c1))
return c1,c2,c3
#中文特征值化
def hanzivec():
c1,c2,c3 = cutword()
cv = CountVectorizer()
data = cv.fit_transform([c1,c2,c3])
print(cv.get_feature_names())
print(data.toarray())
return None
2.3 TfIdf
Tf: term frequency,词的频率;
idf: inverse document frequency,逆文档频率,。
重要性=Tf×Idf,衡量每篇文档中重要的词汇。
主要思想:如果某个词或短语在一篇文章中出现的概率高,
并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分
能力,适合用来分类。
TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
def tfidfvec():
c1,c2,c3 = cutword()
tf = TfidfVectorizer()
data = tf.fit_transform([c1,c2,c3])
print(tf.get_feature_names())
print(data.toarray())
return None
2.4 归一化处理
特征处理:通过特定的统计方法(数学方法)将数据转换成算法要求的数据。
- 数值型数据:标准缩放,1)归一化 2)标准化 3)缺失值;
- 类别型数据:one-hot编码;
- 时间类型:时间的切分。
特点:通过对原始数据进行变换把数据映射到(默认为[0,1])之间
注:作用于每一列,max为一列的最大值,min为一列的最小值,那么X’’
为最终结果,mx,mi分别为指定区间值默认mx为1,mi为0。
#归一化处理
def mm():
mm = MinMaxScaler(feature_range=(2,3))
data = mm.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,46]])
print(data)
return None
当三个特征同等重要的时候,进行归一化处理,使得某一个特征不会对最终的结果造成更大的影响。
注:在特定场景下最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。
标准化方式:,为标准差。
对于归一化来说,如果出现异常点,影响了最大值和最小值,那么结果显然发生改变。
对于标准化来说,如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。因此,大多数使用标准化。
#标准化处理
def stand():
std = StandardScaler();
data = std.fit_transform([[ 1., -1., 3.],[ 2., 4., 2.],[ 4., 6., -1.]])
print(data)
print(std.mean_)
print(std.scale_)
在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。
2.5 缺失值处理
- 删除:如果每列或者行数据缺失值达到一定的比例,建议放弃整行或者整列;
- 插补:可以通过缺失值每行或者每列的平均值、中位数来填充。
Imputer(missing_values='NaN', strategy='mean', axis=0)
#完成缺失值插补
Imputer.fit_transform(X,y)
#X:numpy array格式的数据[n_samples,n_features]
#返回值:转换后的形状相同的array
#缺失值处理
def im():
#axis中,0是按列填补,1是按行填补
im = Imputer(missing_values='NaN',strategy='mean',axis=0)
data = im.fit_transform([[1, 2], [np.nan, 3], [7, 6]])
print(data)
return None
3.特征选择(数据降维)
降维:减少特征的维度,非数组的维度,即减少特征的数量。
- 冗余:部分特征的相关度高,容易消耗计算性能;
- 噪声:部分特征对预测结果有负影响
特征选择就是单纯地从提取到的所有特征中选择部分特征作为训练集特征,
特征在选择前和选择后可以改变值、也不改变值,但是选择后的特征维数肯
定比选择前小,毕竟我们只选择了其中的一部分特征。
主要方法(三大武器):
- Filter(过滤式):VarianceThreshold,对方差进行过滤,设置方差的大小的阈值,若过小,则删除该特征;
#方差特征选择,删除低方差特征
def var():
va = VarianceThreshold(threshold=1.0)
data = va.fit_transform([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]])
print(data)
return None
- Embedded(嵌入式):正则化、决策树;
- Wrapper(包裹式)。
4. 主成分分析
PCA:特征数量达到上百的时候,考虑数据的简化。PCA是一种分析、简化数据集的技术
。是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。可以削减回归分析或者聚类分析中特征的数量。
#主成分分析进行特征降维
def pca():
# n_components:
#1)小数:0-100%,一般90%-95%,表示保留的信息量
#2)整数:保留的特征数
pca = PCA(n_components=0.9)
data = pca.fit_transform([[2,8,4,5],[6,3,0,8],[5,4,9,1]])
print(data)
#输出
[[ 1.28620952e-15 3.82970843e+00]
[ 5.74456265e+00 -1.91485422e+00]
[-5.74456265e+00 -1.91485422e+00]]
案例分析:
import pandas as pd
from sklearn.decomposition import PCA
#读取表的数据
prior = pd.read_csv('F:\PythonProject\MachineLearning\DataSet\instacart-market-basket-analysis\order_products__prior2.csv')
products = pd.read_csv('F:\PythonProject\MachineLearning\DataSet\instacart-market-basket-analysis\products2.csv')
orders = pd.read_csv('F:\PythonProject\MachineLearning\DataSet\instacart-market-basket-analysis\orders2.csv')
aisles = pd.read_csv('F:\PythonProject\MachineLearning\DataSet\instacart-market-basket-analysis\\aisles.csv')
#合并四张表到一张表
_mg = pd.merge(prior,products,on=['product_id','product_id'])
_mg = pd.merge(_mg,orders,on=['order_id','order_id'])
_mg = pd.merge(_mg,aisles,on=['aisle_id','aisle_id'])
print(_mg.head(10))
#交叉表(特殊的分组工具),交叉表是用于统计分组频率的特殊透视表
cross = pd.crosstab(_mg['user_id'],_mg['aisle'])
#进行主成分分析
pca = PCA(n_components=0.9)
data = pca.fit_transform(cross)
3. 机器学习基本问题
- 监督学习(英语:Supervised learning),可以由输入数据中学到或建立一个模型,并依此模式推测新的结果。输入数据是由输入特征值和目标值所组成。函数的输出可以是一个连续的值(称为回归),或是输出是有限个离散值(称作分类)。
- 无监督学习(英语:Supervised learning),可以由输入数据中学到或建立一个模型,并依此模式推测新的结果。输入数据是由输入特征值所组成。
两个问题:
- 分类问题:分类是监督学习的一个核心问题,在监督学习中,当输出变量取有限个离散值时,预测问题变成为分类问题。最基础的便是二分类问题,即判断是非,从两个类别中选择一个作为预测结果;
-
回归问题:回归是监督学习的另一个重要问题。回归用于预测输入变量和输出变量之间的关系,输出是连续型的值。
(1)原始数据,明确问题做什么;
(2)数据的基本处理:如pd处理数据(缺失值,合并表……);
(3)特征工程(特征进行处理);
(4)找到合适算法进行预测;
(5)模型的评估。