人工智能 ,亦称智机器智能 ,指由人制造出来的机器所表现出来的智能。人工智能 的核心问题包括建构能够跟人类似甚至超卓的推理、知识、规划、学习、交流、感知、移物、使用工具和操控机械的能力等。
机器学习 从数据中自动分析获得规律,并利用规律对未知数据进行预测或用于解决实际问题的方法。
机器学习的应用场景:
数据挖掘。
机器视觉。
语言理解。
无人驾驶、机器人。
病例分析。
关于sklearn :针对机器学习应用而开发的算法库。常用功能有:数据预处理、分类、回归、降维、模型选择等常用的机器学习算法。
三大优点:
丰富的算法模块。
易于安装和使用。
样例丰富、教程文档详细。
基于面积的单因子房价预测 :
1 2 3 4 5 import pandas as pdimport numpy as npdata=pd.read_csv('task1_data.csv' ) data.head()
1 2 3 4 5 6 7 from matplotlib import pyplot as pltfig1=plt.figure() plt.scatter(x,y) plt.xlabel('size(x)' ) plt.ylabel('price(y)' ) plt.show()
1 2 3 4 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 ) y=y.reshape(-1 ,1 ) print (x.shape,y.shape)
1 2 3 4 5 from sklearn.linear_model import LinearRegressionmodel=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 ]))y_predict=a[0 ][0 ]*x+b[0 ] print (y_predict)y_predict2=model.predict(x) print (y_predict2)
1 2 3 4 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_scoreMSE=mean_squared_error(y,y_predict) R2=r2_score(y,y_predict) print (MSE,R2)
1 2 3 4 5 6 7 8 9 from matplotlib import pyplot as pltfig1=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 pdimport numpy as npdata=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 pltfig=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[:,'价格' ])
1 2 3 x=data.drop(['价格' ,axis=1 ]) y=data.loc[:,'价格' ]
1 2 3 4 from sklearn.linear_model import LinearRegressionmodel_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
点集越集中说明模型拟合度越好。
1 2 3 x_test=np.array([[160 ,70000 ,5 ]]) y_test_predict=model_multi.predict(x_test)
分类任务与逻辑回归 现实案例如:垃圾短信检测
如何实现:
收集一些样本,告诉计算机那些是垃圾信息。
计算机自动寻找垃圾信息共同特征。
在新信息中检测是否包含垃圾信息特征内容,判断其是否为垃圾信息。
部分特征:发件人、是否群发、网址、元、赢、微信、免费等。
又如:图像识别,手写数字识别,股票涨跌预测
分类预测 :根据数据类别和部分特征信息,自动寻找类别与特征信息的关系,判断一个新的样本属于那种类别。
逻辑回归实现产品分类 :
1 2 3 4 5 import pandas as pdimport numpy as npdata=pd.read_csv('task1_data.csv' ) data.head()
1 2 3 4 5 6 7 8 from matplotlib import pyplot as pltfig1=plt.figure() plt.scatter(data.loc[:,'尺寸1' ],data.loc[:,'尺寸2' ]) plt.title('size1-size2' ) plt.xlabel('size1' ) plt.ylabel('size2' ) plt.show()
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()
1 2 3 4 x=data.drop(['y' ],axis=1 ) y=data.loc[:,'y' ] x.head()
1 2 3 4 5 6 from sklearn.linear_model import LogisticRegressionmodel=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_scoreaccuracy=accuracy_score(y,y_predict)
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)
边界函数如图:
商业异常消费数据预测 :线性边界的逻辑回归模型效果并不好,因此要建立二项式边界的逻辑回归模型。
1 2 3 4 5 import numpy as npimport pandas as pddata=pd.read_csv('task2_data.csv' ) data.head()
1 2 3 4 5 6 7 8 数据可视化 from matplotlib import pyplot as pltfig1=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=data.loc[:,'y' ]==1 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()
1 2 3 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 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 ]
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()
此时图像的边界较为杂乱,因为x1的排列并不是按从小到大的顺序进行的,因此解决方案是将x1排序。
1 2 3 x1_new=x1.sort_values()
1 2 3 4 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计算中应用最多的距离。
曼哈顿距离 :两个点在标准坐标系上的绝对轴距总和。如图:
一般来说,K值越小,分类边界越曲折,抗干扰性更弱(噪声数据影响结果明显)。
信息熵 :是度量随机变量不确定性的指标,熵越大,样本的不确定性就越大。假定当前样本集合D中第K类样本所占比例为Pk ,则D的信息熵为:
目标 :划分后样本分布不确定性尽可能小,即信息熵小,信息增益大。
概率是反应随机事件出现的可能性大小的量度,而条件概率则是给定某事件A的条件下,另一个事件B发生的概率。全概率公式则是利用条件概率将复杂事件A分割成若干简单事件概率的求和问题。贝叶斯公式则是利用条件概率和全概率公式计算后验概率 。
决策树判断员工是否适合相关工作: 关于一些sklearn中的用法:
criterion=’entropy’:以信息熵的变化作为建立树结构的标准。
min_samples_leaf=5:建立树结构最小分支的样本数。
1 2 3 4 5 import pandas as pdimport numpy as npdata=pd.read_csv('task1_data.csv' ) data.head()
1 2 3 4 5 6 7 8 9 10 x=data.drop(['y' ],axis=1 ) y=data.loc[:,'y' ] from sklearn.tree import DecisionTreeClassifiermodel=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_scoreaccuracy=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 pltfig1=plt.figure(figsize=(200 ,200 )) from sklearn import treetree.plt_tree(model,filled='True' ,feature_names=['Skill' ,'Experience' ,'Degree' ,'Income' ],class_names=['Unqualified' ,'Qualified' ])
由于图片比较大,因此将图片保存在本地
1 fig1.savefig('dc_result.png' )
为了达到较好的准确度,一般适当提高最小样本叶子树(避免过拟合)。
1 model2=DecisionTreeClassifier(criterion='entropy' ,min_samples_leaf=50 )
参考图如下(不全):
1 2 3 import matplotlib as mplmpl.rcParams['font.family' ]='SimHei'
朴素贝叶斯预测学生录取及奖学金情况: 1 2 3 4 5 import numpy as npimport pandas as pddata=pd.read_csv('task2_data_csv' ) data.head()
1 2 3 4 5 6 7 8 9 x=data.drop(['y' ,axis=1 ]) y=data.loc[:,'y' ] from sklearn.naive_bayes import CategoricalNBmodel=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_scoreaccuracy=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) 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 ) print (test_data_result)
1 2 3 test_data_result=pd.DataFrame(test_data_result) test_data_result.head()
1 2 test_data_result.columns=['score' ,'school' ,'award' ,'gender' ,'english' ,'p0' ,'p1' ,'p2' ,'y_test_predict' ]
1 test_data_result.to_csv('test_data_result.csv' )