Start Up For Machine Learning

人工智能,亦称智机器智能,指由人制造出来的机器所表现出来的智能。人工智能的核心问题包括建构能够跟人类似甚至超卓的推理、知识、规划、学习、交流、感知、移物、使用工具和操控机械的能力等。

机器学习从数据中自动分析获得规律,并利用规律对未知数据进行预测或用于解决实际问题的方法。

机器学习的应用场景:

  1. 数据挖掘。
  2. 机器视觉。
  3. 语言理解。
  4. 无人驾驶、机器人。
  5. 病例分析。

关于sklearn:针对机器学习应用而开发的算法库。常用功能有:数据预处理、分类、回归、降维、模型选择等常用的机器学习算法。

三大优点:

  1. 丰富的算法模块。
  2. 易于安装和使用。
  3. 样例丰富、教程文档详细。

基于面积的单因子房价预测

1
2
3
4
5
#数据加载
import pandas as pd
import numpy as np
data=pd.read_csv('task1_data.csv')
data.head()
1
2
3
4
5
6
7
#数据可视化
from matplotlib import pyplot as plt
fig1=plt.figure()
plt.scatter(x,y)#散点图
plt.xlabel('size(x)')
plt.ylabel('price(y)')
plt.show()
1
2
3
4
#x,y赋值
x=data.loc[:,'面积']#面积为自变量
y=data.loc[:,'房价']#房价为因变量
print(x,y)
1
2
3
4
5
6
7
8
#数据格式转化(方便运算)
x=np.array(x)
y=np.array(y)
print(x.shape,y.shape)
#将一维变为二维
x=x.reshape(-1,1)#行数不变,列数变为1
y=y.reshape(-1,1)
print(x.shape,y.shape)
1
2
3
4
5
#创建模型实例
from sklearn.linear_model import LinearRegression
model=LinearRegression()
#模型训练
model.fit(x,y)
1
2
3
4
5
6
7
8
9
10
11
#获取线性回归模型系数
a=model.coef_#斜率
b=model.intercept_#截距
print(a,b,"y=f(x)={}*x+{}".format(a[0][0],b[0]))#ax+b

#结果预测
y_predict=a[0][0]*x+b[0]
print(y_predict)
#第二种预测的方法
y_predict2=model.predict(x)
print(y_predict2)
1
2
3
4
#预测面积为100时,对应的价格
X_test=np.array([[100]])#转换为数组
y_test_p=model.predict(X_test)
print(y_test_p)
1
2
3
4
5
6
#模型评估
from sklearn.metrics import mean_squared_error,r2_score
MSE=mean_squared_error(y,y_predict)#均方误差
R2=r2_score(y,y_predict)
print(MSE,R2)
#MSE越小越好,R^2越接近1越好
1
2
3
4
5
6
7
8
9
#预测结果可视化
from matplotlib import pyplot as plt
fig1=plt.figure()
plt.scatter(x,y,label='y_real')
plt.plot(x,y_predict,label='y_predict')
plt.xlabel('size(x)')
plt.ylabel('price(y)')
plt.legend()#在图中显示标签
plt.show()

多因子房价预测

1
2
3
4
5
#数据加载
import pandas as pd
import numpy as np
data=pd.read_csv('task2_data.csv')
data.head(10)
1
2
3
4
5
6
7
8
9
10
11
12
#可视化
from matplotlib import pyplot as plt
fig=plt.figure(figsize=(20,5))#设置图片大小

fig1=plt.subplot(131)#一行三列第一个图
plt.scatter(data.loc[:,'面积'],data.loc[:,'价格'])

fig2=plt.subplot(132)
plt.scatter(data.loc[:,'人均收入'],data.loc[:,'价格'])

fig3=plt.subplot(133)
plt.scatter(data.loc[:,'平均房龄'],data.loc[:,'价格'])

image-20220214162319845

1
2
3
#x,y赋值
x=data.drop(['价格',axis=1])#按列剔除价格,取其余列
y=data.loc[:,'价格']
1
2
3
4
#多因子模型建立与训练
from sklearn.linear_model import LinearRegression
model_multi=LinearRegression()
model_multi.fit(x,y)
1
2
3
#多因子模型预测
y_predict_multi=model_multi.predict(x)
#模型评估同上
1
2
3
4
5
6
#可视化预测结果
fig3=plt.figure(figsize(8,5))
plt.scatter(y,y_predict_multi)
plt.xlabel('real price')
plt.ylabel('predicted price')
plt.show

image-20220214162528945

点集越集中说明模型拟合度越好。

1
2
3
#预测面积=160,人均收入=70000,平均房龄=5的合理房价
x_test=np.array([[160,70000,5]])
y_test_predict=model_multi.predict(x_test)

分类任务与逻辑回归

现实案例如:垃圾短信检测

如何实现:

  1. 收集一些样本,告诉计算机那些是垃圾信息。
  2. 计算机自动寻找垃圾信息共同特征。
  3. 在新信息中检测是否包含垃圾信息特征内容,判断其是否为垃圾信息。
  4. 部分特征:发件人、是否群发、网址、元、赢、微信、免费等。

又如:图像识别,手写数字识别,股票涨跌预测

分类预测:根据数据类别和部分特征信息,自动寻找类别与特征信息的关系,判断一个新的样本属于那种类别。

逻辑回归实现产品分类

1
2
3
4
5
#数据加载
import pandas as pd
import numpy as np
data=pd.read_csv('task1_data.csv')
data.head()

image-20220218233941341

1
2
3
4
5
6
7
8
#数据可视化
from matplotlib import pyplot as plt
fig1=plt.figure()
plt.scatter(data.loc[:,'尺寸1'],data.loc[:,'尺寸2'])
plt.title('size1-size2')
plt.xlabel('size1')
plt.ylabel('size2')
plt.show()

image-20220216095652611

1
2
3
#建立一个用于筛选类编的变量
mask=data.loc[:,'y']==1
print(mask)
1
2
3
4
5
6
7
8
#重新数据可视化
ok=plt.scatter(data.loc[:,'尺寸1'][mask],data.loc[:,'尺寸2'][mask])#正样本
ng=plt.scatter(data.loc[:,'尺寸1'][~mask],data.loc[:,'尺寸2'][~mask])#反样本
plt.title('size1-size2')
plt.xlabel('size1')
plt.ylabel('size2')
plt.legend((ok,ng),('ok','ng'))
plt.show()

image-20220216112537683

1
2
3
4
#x,y赋值
x=data.drop(['y'],axis=1)
y=data.loc[:,'y']
x.head()
1
2
3
4
5
6
#创建模型实例
from sklearn.linear_model import LogisticRegression
model=LogisticRegression()

#模型训练
model.fit(x,y)
1
2
3
4
#模型预测
y_predict=model.predict(x)
y_test=model.predict([1,10])
print('ok'if y_test==1 else 'ng')

准确率=正确预测样本数量/总样本数量。

1
2
3
#模型评估
from sklearn.metrics import accuracy_score
accuracy=accuracy_score(y,y_predict)

image-20220217163930239

1
2
3
4
5
6
#通过边界函数计算边界
theta0=model.intercept_
theta1,theta2=model.coef_[0][0],model.coef_[0][1]
x1=data.loc[:,'尺寸1']
x2_new=-(theta0+theta1*x1)/theta2
plt.plot(x1,x2_new)#边界曲线

边界函数如图:

image-20220217165339155

商业异常消费数据预测:线性边界的逻辑回归模型效果并不好,因此要建立二项式边界的逻辑回归模型。

1
2
3
4
5
#数据加载
import numpy as np
import pandas as pd
data=pd.read_csv('task2_data.csv')
data.head()

image-20220221093541661

1
2
3
4
5
6
7
8
数据可视化
from matplotlib import pyplot as plt
fig1=plt.figure()
plt.scatter(data.loc[:,'pay1'],data.loc[:,'pay2']'y')
plt.title('pay1-pay2')
plt.xlabel('pay1')
plt.ylabel('pay2')
plt.show()
1
2
3
4
5
6
7
8
9
10
11
12
#创建mask
mask=data.loc[:,'y']==1#等于1则为true
fig1=plt.figure()
abnormal=plt.scatter(data.loc[:,'pay1'][mask],data.loc[:,'pay2'][mask])
normal=plt.scatter(data.loc[:,'pay1'][~mask],data.loc[:,'pay2'][~mask])

plt.plot(x1,xw_new)
plt.title('pay1-pay2')
plt.xlabel('pay1')
plt.ylabel('pay2')
plt.legend((abnormal,normal),('abnormal','normal'))
plt.show()

image-20220217174122101

1
2
3
#x,y赋值
x=data.drop(['y'],axis=1)
y=data.loc[:,'y']
1
2
3
4
5
6
7
8
9
#生成二阶数据
x2=data.loc[:,'pay2']
x1_2=x1*x1#x1的平方
x2_2=x2*x2
x1_x2=x1*x2

#创建新的输入数据
x_new={'x1':x1,'x2':x2,'x1_2':x1_2,'x2_2':x2_2,'x1_x2':x1_x2}#创建一个字典
x_new=pd.DataFrame(x_new)#转化格式
1
2
3
4
5
6
7
8
9
#建立新模型
LR2=logisticRegression()
LR2.fit(x_new,y)

#模型预测
y2_predict=LR2.predict(x_new)

#准确率
accuracy2=accuracy_score(y,y2_predict)
1
2
3
#获取边界函数系数、生成新的边界数据
theta0=LR2.intercept_
theta1,theta2,theta3,theta4,theta5=LR2.coef_[0][0],LR2.coef_[0][1],LR2.coef_[0][2],LR2.coef_[0][3],LR2.coef_[0][4]

image-20220221222531805

1
2
3
4
a=theta4
b=theta5*x1+theta2
c=theta0+theta1*x1+theta3*x1*x1
x2_new_2=(-b+np.sqrt(b*b-4*a*c))/(2*a)
1
2
3
4
5
6
7
8
9
10
fig2=plt.figure()
abnormal=plt.scatter(data.loc[:,'pay1'][mask],data.loc[:,'pay2'][mask])
normal=plt.scatter(data.loc[:,'pay1'][~mask],data.loc[:,'pay2'][~mask])

plt.plot(x2,x2_new_2)
plt.title('pay1-pay2')
plt.xlabel('pay1')
plt.ylabel('pay2')
plt.legend((abnormal,normal),('abnormal','normal'))
plt.show()

image-20220221223033531

此时图像的边界较为杂乱,因为x1的排列并不是按从小到大的顺序进行的,因此解决方案是将x1排序。

1
2
3
#排续
x1_new=x1.sort_values()#从小到大排列
#替换

image-20220221223329061

1
2
3
4
#新样本预测 pay1=80,pay2=20
x_test=np.array([[80,20,80*80,20*20,80*20]])
y_predict=LR2.predict(x_test)
print('abnormal' if y_predict==1 else 'normal')

K近邻分类模型:通过计算新数据与训练数据之间的距离,然后选取K(K>=1)个距离最近的邻居进行分类判断(K个邻居),这K个邻居多数属于某个类,就把该数据实例分类到这个类中。

欧氏距离:两点之间的直线距离,KNN计算中应用最多的距离。

曼哈顿距离:两个点在标准坐标系上的绝对轴距总和。如图:

image-20220222170601294

一般来说,K值越小,分类边界越曲折,抗干扰性更弱(噪声数据影响结果明显)。

信息熵:是度量随机变量不确定性的指标,熵越大,样本的不确定性就越大。假定当前样本集合D中第K类样本所占比例为Pk,则D的信息熵为:

image-20220222212212164

目标:划分后样本分布不确定性尽可能小,即信息熵小,信息增益大。

概率是反应随机事件出现的可能性大小的量度,而条件概率则是给定某事件A的条件下,另一个事件B发生的概率。全概率公式则是利用条件概率将复杂事件A分割成若干简单事件概率的求和问题。贝叶斯公式则是利用条件概率和全概率公式计算后验概率

决策树判断员工是否适合相关工作:

关于一些sklearn中的用法:

criterion=’entropy’:以信息熵的变化作为建立树结构的标准。

min_samples_leaf=5:建立树结构最小分支的样本数。

1
2
3
4
5
#数据加载
import pandas as pd
import numpy as np
data=pd.read_csv('task1_data.csv')
data.head()
1
2
3
4
5
6
7
8
9
10
#x,y赋值
x=data.drop(['y'],axis=1)
y=data.loc[:,'y']

#建立决策树模型
from sklearn.tree import DecisionTreeClassifier
model=DecisionTreeClassifier(criterion='entropy',min_samples_leaf=5)

#模型预测
model.fit(x,y)
1
2
3
4
5
#模型预测
y_predict=model.predict(x)
#准确率指标评估
from sklearn.metrics import accuracy_score
accuracy=accuracy_score(y,y_predict)
1
2
3
4
#测试样本预测
x_test=np.array([[1,0,1,1]])
y_test_predict=model.predict(x_test)
print('适合' if y_test_predict==1 else '不适合')
1
2
3
4
5
#作图
from matplotlib import pyplot as plt
fig1=plt.figure(figsize=(200,200))
from sklearn import tree
tree.plt_tree(model,filled='True',feature_names=['Skill','Experience','Degree','Income'],class_names=['Unqualified','Qualified'])#filled为填充

由于图片比较大,因此将图片保存在本地

1
fig1.savefig('dc_result.png')

为了达到较好的准确度,一般适当提高最小样本叶子树(避免过拟合)。

1
model2=DecisionTreeClassifier(criterion='entropy',min_samples_leaf=50)

参考图如下(不全):

image-20220223222354931

1
2
3
#设置字体
import matplotlib as mpl
mpl.rcParams['font.family']='SimHei'

image-20220223222621219

朴素贝叶斯预测学生录取及奖学金情况:

1
2
3
4
5
#数据加载
import numpy as np
import pandas as pd
data=pd.read_csv('task2_data_csv')
data.head()
1
2
3
4
5
6
7
8
9
#x,y赋值
x=data.drop(['y',axis=1])
y=data.loc[:,'y']

#创建朴素贝叶斯模型并训练
from sklearn.naive_bayes import CategoricalNB
model=CategoricalNB()
#模型训练
model.fit(x,y)
1
2
3
4
5
6
7
8
9
#训练数据的概率预测
y_predict_prob=model.predict_proba(x)#每个类别有个对应的概率

#训练预测
y_predict=model.predict(x)

#计算模型准确率
from sklearn.metric import accuracy_score
accuracy=accuracy_score(y,y_predict)
1
2
3
4
5
6
7
8
#测试样本预测
x_test=np.array([[2,1,1,1,1]])
y_test_prob=model.predict_proba(x_test)
y_test_predict=model.predict(x_test)
#5个测试样本预测
x_test=np.array([[2,1,1,1,1],[2,1,1,1,0],[2,1,1,0,0],[2,1,0,0,0],[2,0,0,0,0]])
y_test_prob=model.predict_proba(x_test)
y_test_predict=model.predict(x_test)
1
2
3
#数据组合
test_data_result=np.concatenate((x_test,y_test_predict_prob,y_test_predict.reshape(5,1)),axis=1)#axis=1为按列,如果不reshape组合会不能完成
print(test_data_result)

image-20220224115946640

1
2
3
#格式转化
test_data_result=pd.DataFrame(test_data_result)
test_data_result.head()

image-20220224153405317

1
2
#列名称替换
test_data_result.columns=['score','school','award','gender','english','p0','p1','p2','y_test_predict']

image-20220224153854681

1
test_data_result.to_csv('test_data_result.csv')
Author: Jerry Ren
Link: http://example.com/2022/02/09/Start-Up-For-Machine-Learning/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.