目录
线性回归是一种常用的机器学习方法,用于建立一个输入变量与输出变量之间线性关系的预测模型。线性回归的目标是找到一条最佳拟合直线,使得预测值与实际观测值之间的误差最小。
线性回归的训练过程是通过最小化目标变量与预测值之间的平方误差来确定模型的参数。常用的最小化目标函数是平方误差和(Sum of Squared Errors,SSE)。
线性回归模型的优点包括简单易懂、计算效率高、可解释性强。然而,线性回归模型的局限性在于假设了输入和输出之间的关系是线性的,无法很好地处理非线性关系。
线性回归模型可以通过添加多项式特征、交互项或者使用其他非线性变换方法来解决非线性问题。此外,还可以使用正则化技术(如岭回归、Lasso回归)来改善模型的泛化能力和抗噪能力。
参考:Logistic Regression逻辑线性回归(基于diabetes数据集)-CSDN博客
Ridge & Lasso Regression解决线性回归的过拟合(Overfitting)(基于波士顿房价预测)-CSDN博客
?Linear Regression线性回归(一元、多元)-CSDN博客
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
data=pd.read_csv("Titanic.csv")
data.isnull()#true即为缺失,也可以用isna()
sns.heatmap(data.isnull())#可以看到age和cabin缺失数据比较多
?
sns.heatmap(data.isnull(),yticklabels=False,cmap='rainbow')
?
data['Age'].isnull().sum()
#结果:263
data['Cabin'].isnull().sum()
#结果:1014
sns.set_style('whitegrid')
sns.countplot(x='Survived',data=data)#死亡的人占大部分
data['Survived'].value_counts()
?
sns.set_style('whitegrid')
sns.countplot(x='Survived',hue='Pclass',data=data,palette='rainbow')#再分舱位
?
sns.displot(data['Age'],kde=True,color='darkred',bins=40)
?
sns.countplot(x='SibSp',data=data)#亲属
?
plt.figure(figsize=(12,7))
sns.boxplot(x='Pclass',y='Age',data=data)#可以看出舱位和年龄的关系
?
data[data['Pclass']==1]['Age'].median()#每个舱位的平均年龄
#39
data[data['Pclass']==2]['Age'].median()
#29
data[data['Pclass']==3]['Age'].median()
#24
def addage(X):
Age = X[0]
Pclass=X[1]
if pd.isnull(Age):
if Pclass == 1:
return 39
elif Pclass ==2:
return 29
else:
return 24
else:
return Age
data['Age']=data[['Age','Pclass']].apply(addage,axis=1)#赋值给这个函数
data.drop('Cabin',axis=1,inplace=True)#因为船舱房间号缺失严重,删除这列数据
sns.heatmap(data.isnull(),yticklabels=False,cmap='rainbow')#都无缺失数据
????????
data.info()##需要转化object类型的数据
'''结果:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1309 entries, 0 to 1308
Data columns (total 11 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 PassengerId 1309 non-null int64
1 Survived 1309 non-null int64
2 Pclass 1309 non-null int64
3 Name 1309 non-null object
4 Sex 1309 non-null object
5 Age 1309 non-null float64
6 SibSp 1309 non-null int64
7 Parch 1309 non-null int64
8 Ticket 1309 non-null object
9 Fare 1308 non-null float64
10 Embarked 1307 non-null object
dtypes: float64(2), int64(5), object(4)
memory usage: 112.6+ KB
'''
data['Embarked'].unique()
#array(['S', 'C', 'Q', nan], dtype=object)
pd.get_dummies(data['Embarked'],drop_first=True)#三个数据,用两个表示即可,00表示C
pd.get_dummies(data['Sex'],drop_first=True)#两个数据,一个表示即可,0表示falme
sex=pd.get_dummies(data['Embarked'],drop_first=True)
embark=pd.get_dummies(data['Sex'],drop_first=True)
data=pd.concat([data,sex,embark],axis=1)#数据汇总
data.drop(['Sex','Embarked','Name','Ticket'],axis=1,inplace=True)#删除类别数据,无用数据
#数据清洗完毕,开始建模
#y变量是0,1二分类,用from sklearn.linear_model import LogisticRegression#逻辑线性回归
X=data.drop('Survived',axis=1)
y=data['Survived']
from sklearn.model_selection import train_test_split#将数据分成测试和训练集
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=0)#测试集占百分之三十,random_state=0随机抽取数据集里的成为测试集
from sklearn.linear_model import LogisticRegression
logitmodel = LogisticRegression()
logitmodel.fit(X_train,y_train)
y_predictions= logitmodel.predict(X_test)#预测值
from sklearn.metrics import confusion_matrix
confusion_matrix(y_test,y_predictions)
'''结果:
array([[193, 29],
[ 25, 146]], dtype=int64)
'''
from sklearn.metrics import accuracy_score
accuracy=accuracy_score(y_test,y_predictions)#模型值
#0.8625954198473282
from sklearn.metrics import classification_report
print(classification_report(y_test,y_predictions))
'''结果:
precision recall f1-score support
0 0.89 0.87 0.88 222
1 0.83 0.85 0.84 171
accuracy 0.86 393
macro avg 0.86 0.86 0.86 393
weighted avg 0.86 0.86 0.86 393
?
'''